花匠人从多个角度为你分享spring事务失效的一些场景(spring事务失效的几种常见情况)(),让你更加了解spring事务失效的一些场景(spring事务失效的几种常见情况)(),包含生活百科相关的生活技巧、生活小窍门、生活小妙招等生活百科知识。
本篇文章为你整理了spring事务失效的一些场景(spring事务失效的几种常见情况)()的详细内容,包含有spring事务失效的一些场景(spring事务失效的几种常见情况) 等,让你从多个方面了解spring事务失效的一些场景(spring事务失效的几种常见情况)(),希望对你有帮助。
1、 @Transactional 只能作用在public修饰的方法上 spring事务的实现AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断,如果目标方法不是public,则TransactionAttribute返回null,即不支持事务。
2、方法用final修饰 这样的话会导致事务的失效,因为spring事务底层实现使用了代理,aop,通过jdk的动态代理或者cglib,生成了代理类,在代理类中实现了事务功能,如果方法被final修饰,无法重写该方法,也就无法添加事务的功能了
3、方法内部调用 同一个service中 A方法调用B方法。如果两个方法都写了@Transactional,B方法发生异常, AB都会回滚。同一个service中 A方法调用B方法。A方法没有加@Transactional,B方法加了@Transactional,B方法发生异常,AB都不会回滚。同一个service中 A方法调用B方法。A方法加@Transactional,B方法没有加@Transactional,B方法发生异常,AB都会回滚。 下图为例子: A方法即orderTest B方法即createOrder() 然后在B方法当中制造一个异常,int count = 1/0,进行测试。
4、多线程调用 情形一:AB两个service
Aservice中的a方法调用 Bservice中的b方法,a、b方法都加了@Transactional,b方法发生异常,a不会回滚,b会回滚。Aservice中的a方法调用 Bservice中的b方法,a方法没有加@Transactional,b方法加了@Transactional, b方法发生异常,a不会回滚,b会回滚。Aservice中的a方法调用 Bservice中的b方法,a方法加@Transactional,b方法没有加@Transactional, b方法发生异常,a、b都不会回滚。 下图为例子:
情形二:同一个service
同一个service中 a方法调用b方法,a、b方法都加了@Transactional, b方法发生异常,a、b都不会回滚。同一个service中 a方法调用b方法,a方法没有加@Transactional, b方法加了@Transactional,b方法发生异常,a、b都不会回滚。同一个service中 a方法调用b方法,a方法加@Transactional, b方法没有加@Transactional,b方法发生异常,a、b都不会回滚。 下图为例子:
5、数据库引擎是MyISAM的话也是不支持事务的。 6 try catch手动捕获异常 这种情况也是分两种。 第一种捕获了异常,但是没有throw,是不会回滚的。
下图为例子:
第二种捕获了异常,并且throw了异常,会回滚。 但是这个throw的异常,必须是运行时异常才可以。 @Transcation 默认只回滚 (JVM级别)抛出RuntimeException 及Error异常的事务
下图为例子:
参考文章:https://www.jb51.net/article/256104.htm
以上就是spring事务失效的一些场景(spring事务失效的几种常见情况)()的全部内容,想要了解更多spring事务失效的一些场景(spring事务失效的几种常见情况)()相关的内容,请持续关注我们。
以上就是花匠人为你整理的spring事务失效的一些场景(spring事务失效的几种常见情况)(),如果你还想了解更多生活百科知识,请持续关注花匠人。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。