Spring事务失效的场景
异常捕获处理
在方法中通过异常捕获将异常处理掉了
就不会触发异常回滚
如果需要捕获的同时进行事务管理
可以在catch块中进行手动抛出异常
抛出检查异常
在方法上抛出检查异常
但Spring默认只会回滚Runtime异常
需要在@Transactional注解中设置rollbackfor=需要回滚的异常
非public方法(或使用final修饰)
因为Spring事务使用AOP实现
无论是CGLIB的继承代理
还是动态代理的接口代理都无法代理非public方法
方法的内部调用
因为内部调用使用this对象调用
并没有使用代理对象,不会走AOP被代理
需要注入自己解决
没有被Spring管理
略
多线程调用
Spring的事务是通过连接数据库实现
如果不在同一个线程内,那数据库的连接自然也不是一个
编程式事务
通过transactionTemplate.execute()方法控制事务