精华内容
下载资源
问答
  • Spring事务注解Transactional失效

    万次阅读 2018-05-26 14:25:52
    前情提要:当Service接口实现类中存在内部方法调用,并且方法需要支持事务控制时,事务控制失效,事务的传播级别为默认REQUIRED(默认模式)。1、简化版翻车代码:Service接口层Service接口实现类2、需求说明:(1)...

    前情提要:当Service接口实现类中存在内部方法调用,并且方法需要支持事务控制时,事务控制失效,事务的传播级别为默认REQUIRED(默认模式)。

    1、简化版翻车代码:

    那些年趟过的坑三——Spring事务注解Transactional失效

    Service接口层

    那些年趟过的坑三——Spring事务注解Transactional失效

    Service接口实现类

    2、需求说明:

    (1)数据库表主要有两个,t_user(用户表),t_sms(发送短信记录表);

    (2)主业务为新用户注册,往数据库中添加用户记录,t_user表中有记录存在,后面的其他操作不应该影响此操作(方法有事务);

    (3)辅助功能(方法有事务),先往t_sms表中记录短信内容,再调API网关服务,向用户发送注册成功短信提醒,如果API网关服务调用成功,则t_sms表中有记录,如查API网关服务调用失败,则t_sms表中无记录(事务回滚)

    3、结果:

    当辅助功能方法发生异常时,该方法的事务控制失效,两张表中都会有记录存在,没达到预期的效果。

    4、@Transactional失效原因分析:

    在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,再由这个代理对象来统一管理,当在Service实现类直接调用内部方法时,其本质是通过this对象来调用的方法,而不是代理对象,因为会出现事务失效的情况

    5、解决方法:

    显示的通过代理对象来调用方法:

    UserService currentProxy = (UserService) AopContext.currentProxy();

    currentProxy.addSms(user);

    那些年趟过的坑三——Spring事务注解Transactional失效

    如果如上操作还生效,则在在Spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>暴露代理对象,同时引入aspectj 和cglib相关jar包

    6、总结——注解方式的事务使用注意事项:

    (1)正确的设置@Transactional 的 propagation 属性

    (2)正确的设置@Transactional 的 rollbackFor 属性

    (3)@Transactional 只能应用到 public 方法才有效

    (4)遇到方法自调用问题,显示通代理对象调用


    展开全文
  • 1.概述对声明式事务管理,Spring提供了基于Transactional注解的实现方式,使用简单,减少了很多复杂的配置。但是,正因为它的简单,很多开发人员在使用的时候,...

    0?wx_fmt=png

    1.概述

    对声明式事务管理,Spring提供了基于Transactional注解的实现方式,使用简单,减少了很多复杂的配置。但是,正因为它的简单,很多开发人员在使用的时候,随手就是一个@Transactional,以为这样就把事务的问题解决了,何不知这样的使用方式很可能留下了很大的性能隐患。

    2.原理

    Spring很多的特性是基于动态代理实现的,Transactional注解的实现就是其中之一。TxNamespaceHandler类是深入理解Transactional注解实现方式的入口类。从源码分析得知,如果在类A上标注Transactional注解,Spring容器会在启动的时候,为类A创建一个代理类B,类A的所有public方法都会在代理类B中有一个对应的代理方法,调用类A的某个public方法会进入对应的代理方法中进行处理;如果只在类A的b方法(使用public修饰)上标注Transactional注解,Spring容器会在启动的时候,为类A创建一个代理类B,但只会为类A的b方法创建一个代理方法,调用类A的b方法会进入对应的代理方法中进行处理,调用类A的其它public方法,则还是进入类A的方法中处理。在进入代理类的某个方法之前,会先执行TransactionInterceptor类中的invoke方法,完成整个事务处理的逻辑,如是否开启新事务、在目标方法执行期间监测是否需要回滚事务、目标方法执行完成后提交事务等。

    3.问题

    当下对数据库连接的使用基本上都用连接池技术,每个应用会根据环境和自身需求设置一些合适的连接池配置,如果每个连接都一直被长时间占用,会导致数据库连接数不够用、系统各项压力指标不断攀升、系统缓慢等问题,所以说连接池中的每一个连接都是很昂贵的。那么问题就来了,只要需要事务就需要占用一个数据库连接,如果在需要开启事务的方法里进行一些IO操作、网络通讯等需要长时间处理的操作,这个数据库连接就一直被占用着,直到方法执行结束后自动提交事务或执行过程中发生异常回滚事务,这个数据库连接才会被释放掉。这个过程中还有一个很可怕的问题,如果在需要开启事务的方法里进行了网络通讯操作,而这个操作没有设置网络超时时间,那这个数据库连接就会被一直占用着。上述问题,在流量很大的情况下简直就是灾难,会直接导致应用系统挂掉。

    4.正确姿势

    正确的使用Transactional注解要做到如下三点:

    1) 不要在类上标注Transactional注解,要在需要的方法上标注。即使类的每个方法都需要事务也不要在类上标注,因为有可能你或别人新添加的方法根本不需要事务。

    2) 标注了Transactional注解的方法体中不要涉及耗时很久的操作,如IO操作、网络通信等。

    3) 根据业务需要设置合适的事务参数,如是否需要新事务、超时时间等。

    5.小结

    对Spring框架的使用,多思考为什么。

    0?wx_fmt=png

    展开全文
  • 不要在类上标注Transactional注解,要在需要的方法上标注。即使类的每个方法都需要事务也不要在类上标注,因为有可能你或别人新添加的方法根本不需要事务。 标注了Transactional注解的方法体中不要涉及耗时很久的...

    正确用法:

    1. 不要在类上标注Transactional注解,要在需要的方法上标注。即使类的每个方法都需要事务也不要在类上标注,因为有可能你或别人新添加的方法根本不需要事务。
    2. 标注了Transactional注解的方法体中不要涉及耗时很久的操作,如IO操作、网络通信等。
    3. 根据业务需要设置合适的事务参数,如是否需要新事务、超时时间等。

    链接:https://juejin.im/post/5a76961a6fb9a063417b0488

    错误用法:

    1. A类的a1方法没有标注@Transactional,a2方法标注@Transactional,在a1里面调用a2;
    2. 将@Transactional注解标注在非public方法上。
    展开全文
  • 在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性。但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了。 原因: Transactional是Spring提供的事务管理...

    问题:

    在Spring管理的项目中,方法A使用了Transactional注解,试图实现事务性。但当同一个class中的方法B调用方法A时,会发现方法A中的异常不再导致回滚,也即事务失效了。

    原因:

    Transactional是Spring提供的事务管理注解。关于事务的概念可参见转载的帖子:Spring事务管理(详解+实例)

    重点在于,Spring采用动态代理(AOP)实现对bean的管理和切片,它为我们的每个class生成一个代理对象。只有在代理对象之间进行调用时,可以触发切面逻辑。(Spring动态代理详情可戳:spring自动加载,使用实现类无法加载,使用接口却可以的原因

    而在同一个class中,方法B调用方法A,调用的是原对象的方法,而不通过代理对象。所以Spring无法切到这次调用,也就无法通过注解保证事务性了。

    解决方法1:

    将事务方法放到另一个类中(或者单独开启一层,取名“事务层”)进行调用,即符合了在对象之间调用的条件。

    解决方法2:

    获取本对象的代理对象,再进行调用。具体操作如:

    1) Spring-content.xml上下文中,增加配置:<aop:aspectj-autoproxy expose-proxy="true"/>

    2) 在xxxServiceImpl中,用(xxxService)(AopContext.currentProxy()),获取到xxxService的代理类,再调用事务方法,强行经过代理类,激活事务切面。

    解决方法3:

    很多时候,方法内调用又希望激活事务,是由于同一个方法既有DAO操作又有I/O等耗时操作,不想让耗时的I/O造成事务的太长耗时(比如新增商品同时需要写入库存)。此时,可以将I/O做成异步操作(如加入线程池),而加入线程池的操作即便加入事务也不会导致事务太长,问题可以迎刃而解。

    解决方法4:

    手撸事务:见同分类文章:手撸Spring事务

    展开全文
  • 点击关注公众号,Java干货及时送达作者:向北blog.csdn.net/qq_20597727/article/details/84900994Transactional失效场景介绍第一...
  • 事务注解@transactional

    2019-06-20 15:35:39
    事务的基本概念 先来回顾一下事务的基本概念和特性。数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务,就必须具备ACID特性,即原子性...
  • 怎么使用propagation传播属性 方法一,TransactionDefinition 接口定义 方法二,在services层加注解
  • @Transactional 注解相信大家并不陌生,平时Spring开发中很常用的一个注解,它能保证方法内多个数据库操作的事务性和原子性。任何情况下@Transactional都能保证数据库操作的事务性和原子性么?显然并不是这样,我们...
  • @Transactional 事务处理注解详解

    万次阅读 2019-04-25 10:28:22
    @Transactional 事务处理注解详解 一、 事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理,例子: @Transactional public class TestServiceBean implements TestService {} 当类...
  • @Transactional事务注解失效篇(一)

    千次阅读 2019-08-14 17:08:25
    Spring中的@Transactional相信大家都已经用过不少,不知道大家有没有遇到过明明检查了三遍事务配置都是正确,但是它就是不生效,嘿,你说气不气!
  • Java阿里巴巴规范提示:方法【edit】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback。 # 异常的分类 先来看看异常的分类 error是一定会回滚的。 这里Exception是异常,他又分为...
  • 1. 抛出受查异常XXXException,事务会回滚。2. 抛出运行时异常NullPointerException,事务会回滚。3. Quartz中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。4. 异步任务中,execute...
  • 最近使用@Transactional注解,通过看网上现有文档,将一些不错的文档在此进行一个汇总收集: Spring中Transactional的正确使用 那些年spring声明式事务@Transaction的坑 IBM ...
  • @Transactional注解标注方法修饰符为非public方法时,@Transactional注解将会不起作用。 例如以下代码,定义一个错误的@Transactional标注实现,修饰一个默认访问符的方法: @Service public class TestServiceImpl ...
  • 最近遇到了事务不回滚的情况,很多方法都加tyr catch,在catch中打印日志。但是方法异常时候,日志打印了事务却没有回滚。 Spring AOP异常捕获...简而言之:就是我们用事务注解后,只能在当前@Transactional注...
  • JAVA事务管理注解原理-@Transactional

    万次阅读 2019-08-26 11:00:57
    Spring是通过单例模式将@Transactional注解中的内容加载进来的,中间有一些是BeanFactory的工作,我省去了,直接从注解相关的类开始写流程了,流程大致如下图所示: 1.2 核心源码 源码部分主要记录一下spring...
  • @Transactional注解实现事务管理的原理

    千次阅读 2019-09-17 22:00:32
    在实际项目中,用Spring进行事务控制,我们通常都用@Transactional注解。这个注解用法很简单,把原来jdbc繁琐的事务控制都浓缩在这个注解的使用上了。秉着“知其然,知其所以然”的心态,我们可以思考,这个注解那么...
  • 其实IDEA蛮智能的,如果将事务注解放在private方法上,会给出提示。 在使用 Spring AOP 代理时,Spring 调用 TransactionInterceptor 在目标方法执行前后进行拦截之前,Spring 通过...
  • 主要介绍了Java注解@Transactional事务类内调用不生效问题及解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Spring是如何管理事务的之@Transactional注解详解

    万次阅读 多人点赞 2018-08-02 15:19:51
    前两天在工作中忙的焦头烂额,涉及到@Transactional对于事务的控制,便仔细研究了一下,颇有所获,花费好了几天测试整理,今天才发表出来,希望看到博客的老铁们能有所获吧。话不多说直奔正题。 先简单介绍一下...
  • @Transactional注解详细使用

    万次阅读 2020-06-17 11:33:03
    三、开发案例 workflow服务: payment服务添加注解:回滚所有的异常。 workflow调用payment服务的saveTransactionDatasBatch方法:
  • spring事务注解Transactional的propagation传播属性说明 // 如果有事务,那么加入事务,没有的话新建一个(不写的情况下) @Transactional(propagation=Propagation.REQUIRED) // 容器不为这个方法开启事务 @...
  • SpringBoot 事务注解@Transactional

    万次阅读 2019-04-25 13:47:09
    SpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,非常方便快捷,下面我们就说一下如何进行事务操作。 1. 事务说明 在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两...
  • spring 中事务注解@Transactional与trycatch

    千次阅读 2019-03-06 12:51:15
    spring 中事务注解@Transactional与trycatch 在项目中 @service层中 我们会经常在做一些增删改操作的方法上看到 spring 的事务注解 @transaction 已知@transaction 是让spring 帮我们实现事务的控制。 但是在项目中...
  • https://blog.csdn.net/wkl305268748/article/details/77619367 https://blog.csdn.net/mingyundezuoan/article/details/79017659
  • @Transactional 事务注解

    千次阅读 2017-09-07 15:31:34
    @Transactional 事务注解 @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE, rollbackFor = Exception.class) 简单解析:如果有事务,那么加入事务,没有的话新建一...
  • spring中Transactional事务注解使用避坑: 一个Transactional注解的方法为一个事务! 使用反射调用有Transactional注解方法,注解有效。 在Transactional注解方法中使用递归调用该方法是一个事务!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,738
精华内容 17,095
关键字:

事务注解transactional