Python 官方文档:入门教程 => 点击学习
目录SpringBoot中事务的使用:开启事务的方法中事务回滚的情况:springboot @Transactional 事务不回滚一、异常捕获的原因二、数据库引擎不支持回滚(使用M
1、启动类加上@EnableTransactionManagement注解,开启事务支持(其实默认是开启的)。
2、在使用事务的public(只有public支持事务)方法(或者类-相当于该类的所有public方法都使用)加上@Transactional注解。
在实际使用中一般是在service中使用@Transactional,那么对于controller->service流程中:
如果controller未开启事务,service中开始了事务,service成功执行,controller在之后的运行中出现异常(错误),不会自动回滚。
也就是说,只有在开启事务的方法中出现异常(默认只有非检测性异常才生效-RuntimeException )(错误-Error)才会自动回滚。
如果想要对抛出的任何异常都进行自动回滚(而不是只针对RuntimeException),只需要在使用@Transactional(rollbackFor = Exception.class)即可。
①未发现的异常,程序运行过程中自动抛出RuntimeException或者其子类,程序终止,自动回滚。
②使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚。
③注意:如果在try-catch语句中对可能出现的异常(RuntimeException)进行了处理,没有再手动throw异常,spring认为该方法成功执行,不会进行回滚,此时需要调用②中方法进行手动回滚 (java 框架项目案例:www.fhadmin.org)
另外,如果try-catch语句在finally中进行了return操作,那么catch中手动抛出的异常也会被覆盖,同样不会自动回滚。
//不会自动回滚
try{
throw new RuntimeException();
}catch(RuntimeException e){
e.printStackTrace();
}finally{
}
//会自动回滚
try{
throw new RuntimeException();
}catch(RuntimeException e){
e.printStackTrace();
throw new RuntimeException();
}finally{
}
spring:
jpa:
hibernate:
ddl-auto: update
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #按字段名字建表
show-sql: true
database: mysql
database-platfORM: org.hibernate.dialect.MySQL5InnoDBDialect #使用innodb引擎建表
spring的数据库事务调用的实现原理是aop,而AOP的原理是动态代理,在自调用的过程中,是类自身的调用,而不是代理对象去调用,那么不会产生AOP,没有AOP,意味着@Transactional不会被切面捕获,这样spring就不能把你的代码植入到约定的流程中,于是就产生了事务回滚失败。
解决方案:
1、将涉及到事务的处理都放入一个方法中,由其他类调用。
2、如果非要在本类中调用,那么需要在本类中生成本类的bean对象,由这个bean对象来调用,实现方式也有多种:
最后一种方式的伪代码:
@Service
public class OrderService {
public void insert() {
OrderService proxy = (OrderService) AopContext.currentProxy();
proxy.insertOrder();
}
@Transactional
public void insertOrder() {
//SQL操作
}
}
因为AopContext默认是不暴露当前代理类的,所以要@EnableAspectJAutoProxy(exposeProxy =true)或者<aop:aspectj-autoproxy expose-proxy=“true”/>:
在Spring 的AOP实现有两种代理方式:
Spring在项目中会根据被代理对象是否实现了接口来自动切换上述两种代理方式
所以private方法也不能实现事务
到此这篇关于关于SpringBoot的异常回滚和事务的使用详解的文章就介绍到这了,更多相关SpringBoot异常回滚和事务的使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: 关于SpringBoot的异常回滚和事务的使用详解
本文链接: https://lsjlt.com/news/213501.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
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