Spring事务失效的场景

251 阅读2分钟

一:数据库失效场景

Mysql 因为之后innodb 引擎才支持springboot事务,如果不选用该引擎,那么及时贴了事务注解也是不管用的

二:内部类访问

因为Spring 使用注解取到的是prox的代理对象,那么spring可以使用prox的代理对象来进行代理访问,那么这个代理类会被Spring所管理,也就可以进行asp切面操作,来封装,或者写事务,而你在一个类里面写了A方法(无事务),B方法(有事务)那么 proxObject.a(){b()} 那么你调用a方法就是不生效的,如果proxObject().a(proxyObject.b()) 那么此时调用的方法就有事务。

三:private 私有方法贴事务注解

这种方法,贴事务注解不会生效,原因是Spring 不会代理private 修饰的方法,既然不会代理,那么在刷新容器(init)就不会讲private 的方法放入进去,所以private 修饰也不会生效

四:抛出异常类型错误

引起事务注解,只有处理运行时异常,如果抛出的异常类型不对,那么事务也不会生效

五:当子线程出现错误的时候

当子线程发生异常的时候,其主线程是没办法捕获到子线程的异常的所以也没办法进行回滚

六:事务的传播机制

是Spring事务的传播机

@Transactional(propagation = Propagation.SUPPORTS ,rollbackFor = RuntimeException.class)
REQUIRED默认,如果存在事务,则支持当前事务;不存在,则开启一个新事务
SUPPORTS如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
MANDATORY需要在一个正常的事务内执行,否则抛异常
REQUIRES_NEW不管存不存在事务,都开启一个新事务
NOT_SUPPORTED不管存不存在,都以非事务方式执行,当存在事务时,挂起事务
NEVER非事务方式执行,如果存在事务,则抛异常
NESTED如果不存在事务,则开启一个事务运行;如果存在事务,则运行一个嵌套事务