事务什么场景下会失效?
访问权限问题
访问权限是private、default或protected的话,spring则不会提供事务功能。只有public方法才会提供事务方法用final修饰
如果你看过spring事务的源码,可能会知道spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。 但如果某个方法用final修饰了,那么在它的代理类中,就无法重写该方法,而添加事务功能。
如果某个方法是static的,同样无法通过动态代理,变成事务方法
方法内部调用
在普通方法中,调用事务方法。因为这种方法直接调用了this对象的方法,所以updateStatus方法不会生成事务。没有走spring代理未被spring管理
多线程调用
不在同一个线程中,获取到的数据库连接不一样,从而是两个不同的事务
spring的事务是通过数据库连接来实现的。当前线程中保存了一个map,key是数据源,value是数据库连接
我们说的同一个事务,其实是指同一个数据库连接,只有拥有同一个数据库连接才能同时提交和回滚。如果在不同的线程,拿到的数据库连接肯定是不一样的,所以是不同的事务。
表不支持事务
未开启事务
错误的传播特性
自己吞了异常
手动抛了别的异常
自定义了回滚异常
嵌套事务回滚多了
大事务问题: 解决方案可以使用TransactionTemplate编程式事务
1-5点事务不生效; 6-12点事务不回滚