一:数据库失效场景
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 | 如果不存在事务,则开启一个事务运行;如果存在事务,则运行一个嵌套事务 |