@Transactional使用细节

news2024/11/29 2:50:36

版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

在这里插入图片描述

动态代理回顾

Spring的声明式事务管理是建立在 AOP 的基础之上的。Spring AOP是通过动态代理实现的。如果代理对象实现了接口,则使用JDK的动态代理;反之则使用cglib的动态代理。

@Transactional的使用细节

@Transactional注解可以作用于接口、接口方法、类以及类方法上。一般情况下,@Transactional注解使用在类上或类中的方法上;或者是接口上或接口中方法上,都可以实现事务功能。不过,有个细节问题需要注意,我们来看看官方文档的描述:

Spring recommends that you only annotate concrete classes (and methods of concrete classes) with the @Transactional annotation, as opposed to annotating interfaces. You certainly can place the @Transactional annotation on an interface (or an interface method), but this works only as you would expect it to if you are using interface-based proxies. The fact that Java annotations are not inherited from interfaces means that if you are using class-based proxies ( proxy-target-class=“true”) or the weaving-based aspect ( mode=“aspectj”), then the transaction settings are not recognized by the proxying and weaving infrastructure, and the object will not be wrapped in a transactional proxy, which would be decidedly bad.

官方文档地址:https://docs.spring.io/spring-framework/docs/5.0.x/spring-framework-reference/data-access.html#transaction-declarative-annotations
在这里插入图片描述

Spring官方建议在类或类中的方法上使用@Transactional注解,而不是在接口或接口中的方法上使用。

在Java中,当你创建一个注解(比如@Transactional)并将其应用于某个接口或接口的方法上时,这个注解并不会自动被该接口的实现类继承。注解的继承行为与普通的Java类和接口继承不同。这意味着,仅仅在接口上放置注解并不足以确保所有实现该接口的类都会获得该注解所声明的行为(例如该示例中的事务管理)。

Spring框架提供了两种主要的动态代理机制来增强类的功能,比如添加事务管理:

  • 1、基于接口的动态代理:Spring默认使用JDK的动态代理,它要求被代理的对象至少实现一个接口。在这种情况下,Spring会创建一个实现了相同接口的代理对象,并将调用委托给原始对象,同时在调用前后添加额外的逻辑(如事务管理)。如果@Transactional注解被应用在接口或接口方法上,并且你使用的是这种代理方式,那么注解会被代理机制识别,事务管理会正常工作。
  • 2、基于类的动态代理:如果目标类没有实现接口,或者你在配置中显式指定了proxy-target-class=“true”,Spring会使用CGLIB库来创建一个目标类的子类作为代理。这个子类会重写父类的方法,并在重写的方法中添加额外的逻辑。但是,由于Java注解不是从接口继承到实现类的,如果你将@Transactional注解放在接口上,而你的代理是基于类的(即使用CGLIB),那么这个注解将不会被代理机制识别,因此事务管理不会生效。

AspectJ的织入方式是另一种增强类功能的机制,它可以在编译时、加载时或运行时将额外的逻辑织入到类中。与基于类的动态代理类似,如果@Transactional注解仅被应用在接口上,而你的项目使用的是AspectJ织入,那么这个注解同样不会被识别,因为它不会从接口传递到具体的类。

所以,为了确保@Transactional注解能够按预期工作,无论你的项目使用哪种代理或织入方式,最佳实践是将这个注解直接应用在具体的类或其方法上,而不是接口或接口方法上。这样可以避免由于注解不被识别而导致的事务管理失效的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot整合knife4J 3.0.3

Knife4j的前身是swagger-bootstrap-ui,前身swagger-bootstrap-ui是一个纯swagger-ui的ui皮肤项目。项目正式更名为knife4j,取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍,更名也是希望把她做成一个为Swagger接口文档服务的通用性解决方案,不仅仅只是专注于前端Ui…

【IP组播】PIM-SM的RP、RPF校验

目录 一:PIM-SM的RP 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.配置IGP 3.配置PIM-SM和静态RP 4.配置动态RP 5.配置Anycast RP 二: RPF校验 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.配置IGP 3.配置PIM-DM 4.RPF校…

LeetCode_876(链表的中间结点)

//双指针//时间复杂度O(n) 空间复杂度O(1)public ListNode middleNode(ListNode head) {ListNode slowhead,fast head;while (fast!null && fast.next!null){slow slow.next;fast fast.next.next;}return slow;} 1->2->3->4->5->null 快指针移动两个…

如何创建一个TCP多人聊天室?

一、什么是TCP? TCP(Transmission Control Protocol)是一种可靠的 面向连接的协议 ,可以保证数据在传输过程中不会丢失、重复或乱序。 利用TCP实现简单聊天程序,需要客户端和服务器端之间建立TCP连接,并通…

一条SQL在MySQL中的执行过程

图解: 第⼀步:连接器 过程 1. 建⽴连接:与客户端进⾏ TCP 三次握⼿建⽴连接; 2. 校验密码:校验客户端的⽤户名和密码,如果⽤户名或密码不对,则会报错;3. 权限判断&#xff1a…

HCIP【GRE VPN配置】

目录 实验要求: 实验配置思路: 实验配置过程: 一、按照图式配置所有设备的IP地址 (1)首先配置每个接口的IP地址 (2)配置静态路由使公网可通 二、在公网的基础上创建GRE VPN隧道&#xff0…

【yy讲解PostCSS是如何安装和使用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

保研线性代数机器学习基础复习2

1.什么是群(Group)? 对于一个集合 G 以及集合上的操作 ,如果G G-> G,那么称(G,)为一个群,并且满足如下性质: 封闭性:结合性:中性…

Linux多进程通信(1)——无名管道及有名管道使用例程

管道是半双工通信,如果需要 双向通信,则需要建立两个管道, 无名管道:只能父子进程间通信,且是非永久性管道通信结构,当它访问的进程全部终止时,管道也随之被撤销 有名管道:进程间不需…

【核弹级软安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件

Red Hat 发布了一份“紧急安全警报”,警告称两款流行的数据压缩库XZ Utils(先前称为LZMA Utils)的两个版本已被植入恶意代码后门,这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094,其CVS…

从大厂裸辞半年,我靠它成功赚到了第一桶金,如果你失业了,建议这样做,不然时间太久了就完了

程序员接私活和创业是许多技术从业者关注的话题。下面我将介绍一些程序员接私活和创业的渠道和建议: 接私活的渠道: 自媒体平台: 可以利用社交媒体、个人博客、技术社区等平台展示自己的作品和技能,吸引潜在客户。自由工作平台&…

C#(winform) 调用MATLAB函数

测试环境 VisualStudio2022 / .NET Framework 4.7.2 Matlab2021b 参考:C# Matlab 相互调用 Matlab 1、编写Matlab函数 可以没有任何参数单纯定义matlab处理的函数,输出的数据都存在TXT中用以后期读取数据 function [result,m,n] TEST(list) % 计算…

数据分析之Tebleau 的度量名称和度量值

度量名称 包含所有的维度 度量值 包含所有的度量 度量名称包含上面所有的维度,度量值包含上面所有的度量 当同时创建两个或两个以上度量或维度时,会自动创建度量名称和度量值 拖入省份为行(这会是还没有值的) 可以直接将销售金额拖到数值这里 或者将销售…

Kafka 学习之:基于 flask 框架通过具体案例详解生产消费者模型,这一篇文章就够了

文章目录 案例信息介绍后端异步处理请求和后端同步处理请求同步方式异步方式 环境文件目录配置.envrequirements.txt 完整代码ext.pyapp.pykafka_create_user.py 运行方式本地安装 kafka运行 app.py使用 postman 测试建立 http 长连接,等待后端处理结果发送 RAW DAT…

# 达梦数据库知识点

达梦数据库知识点 测试数据 -- SYSDBA.TABLE_CLASS_TEST definitionCREATE TABLE SYSDBA.TABLE_CLASS_TEST (ID VARCHAR(100) NOT NULL,NAME VARCHAR(100) NULL,CODE VARCHAR(100) NULL,TITLE VARCHAR(100) NULL,CREATETIME TIMESTAMP NULL,COLUMN1 VARCHAR(100) NULL,COLUMN…

ARP原理

解析原理 动态ARP通过广播ARP请求和单播ARP应答这两个过程完成地址解析 当需要通信的两台主机处于同一网段时,如上图中的Host_1和Host_3,Host_1要向Host_3发送数据。 首先,Host_1会查找自己本地缓存的ARP表,确定是否包含Host_3对…

精通Go语言文件上传:深入探讨r.FormFile函数的应用与优化

1. 介绍 1.1 概述 在 Web 开发中,文件上传是一项常见的功能需求,用于允许用户向服务器提交文件,如图像、文档、视频等。Go 语言作为一门强大的服务器端编程语言,提供了方便且高效的方式来处理文件上传操作。其中,r.F…

155 Linux C++ 通讯架构实战10,工具telent 和 wireshark的使用

telnet工具使用介绍 windows 上开启telnet linux 上开始telnet 使用telnet //是一款命令行方式运行的客户端TCP通讯工具,可以连接到服务器端,往服务器端发送数据,也可以接收从服务器端发送过来的信息; //类似nginx5_1_1_clie…

IO流c++

IO流类库 输入输出流 #include <iostream> using namespace std;class InCount { public:InCount(int a 0, int b 0){c1 a;c2 b;}void show(void){cout << "c1" << c1 << "\t" << "c2" << c2 << …

Go 语言学习一篇入门

Goloang的优缺点 Goloang的优点 极其简单的部署方式 可直接编译成机器码不依赖其他库直接运行即可部署 语言层面的并发 天生的基因支持充分的利用多核 强大的标准库 runtime 系统调度机制高效的GC垃圾回收丰富的标准库 Goloang的不足 包管理&#xff0c;大部分包都在g…