Python 官方文档:入门教程 => 点击学习
目录使用@Transactional注解遇到的问题1、不建议在接口上添加@Transactional注解2、@Transactional注解3、默认情况下4、数据库引擎需要支持事务管
一般在service类标签上添加@Transactional即可
只能应用到public可见度的方法上。如果应用到protected、private或者package可见度的方法上时,不会报错,但事务也不会起作用
spring会对uncheck异常进行事务回滚的;如果是checked异常则不会回滚,可添加注解 @Transactional(rollbackFor=Exception.class) 是的checked异常回滚。
如果是Mysql,注意表要使用事务的引擎,比如innodb,如果是myisam,事务不会起作用的
没有@Transactional 注解,在其内部调用有@Transactional 注解的方法,有@Transactional 注解的方法methodB()的事务被忽略,不会开启新的事务,也不会发生回滚。例如:
@Service
public class TransactionService {
public void methodA(){
this.methodB();
}
@Transactional
public void methodB(){
}
}
原因:Spring采用动态代理(aop)实现对bean的管理和切片,它为我们的每个class生成一个代理对象。只有在代理对象之间进行调用时,可以触发切面逻辑。在 Spring 的 AOP 代理下,只有目标方法由外部调用,目标方法才由 Spring 生成的代理对象来管理。
详解:Spring的事务管理是通过AOP实现的,其AOP的实现对于非final类是通过cglib这种方式,即生成当前类的一个子类作为代理类,然后在调用其下的方法时,会判断这个方法有没有@Transactional注解,如果有的话,则会开启一个新的事务,并通过动态代理实现事务管理(拦截方法调用,执行事务等切面)。
当methodA()中调用methodB()时,并不是使用的代理对象,而是普通的javabean,从而导致this.methodB()时也不是代码对象,从而导致@Transactional失败,即发现methodA()上并没有@Transactional注解,所以整个AOP代理过程(事务管理)不会发生。
解决办法:
1、把这两个方法分开到不同的类中;
2、把注解@Transactional加到类名上面去;
3、把注解@Transactional加到methodA()方法上,methodB()不添加注解,在调用methodB()时两个方法的事务都会生效,因为methodA()默认的事务传播属性为PROPAGATION_REQUIRED,此时methodB()会加入到methodA()中
@Service
public class TransactionService {
@Transactional
public void methodA(){
this.methodB();
}
public void methodB(){
}
}
4、获取本对象的代理对象,再进行调用。具体操作如:
那么该方法事务不会回滚。本类中A方法(有事务注解)调用其他类中B方法(有事务注解,该类在容器中),B方法中捕获了异常,事务失效不可以回滚,在B方法中的catch里进行异常抛出则可以正常回滚。
本类中A方法(有事务注解)调用其他类中B方法(有事务注解,该类在容器中),A方法中捕获了异常,spring事务机制检测到异常,进行回滚。
所以最好在业务层catch中抛出异常让控制层捕获。
在该类中A方法调用本类中B方法,A方法上没有事务注解,B方法上有事务注解,则B方法中出现异常,B方法事务不会回滚,A方法没有事务注解也不会回滚。
调用了本类B方法,B方法出现异常也整体可回滚。
其他类中B方法(有事务注解,该类在容器中),B方法发生异常,可以回滚。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: 解决SpringBoot中使用@Transactional注解遇到的问题
本文链接: https://www.lsjlt.com/news/136352.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0