Spring 的事务管理是通过 AOP(面向切面编程)实现的,并且依赖于代理机制。具体来说,Spring 使用动态代理来增强目标对象,从而在方法调用前后插入事务管理的逻辑。
那么失效的场景就有:
- 使用 try-catch语句块,对异常进行捕获,但没有将异常抛出去(人家怎么知道出现异常了),事务失效。
- rollbackFor使用默认的,默认的只会回滚RuntimeException和Error异常,那些检查异常不会回滚。配置 rollbackFor 属性为 Exception。
- 方法或者类被final修饰。动态代理的本质是继承你这个类,都final了,怎么继承。
- 方法不是public修饰的,你都private了,人家怎么走代理。
- 方法是static修饰的静态方法。静态方法属于类,不属于任何实例。
- 事务传播行为使用错误。
- 如果方法 A 和方法 B 在同一个类中,由于 Spring 默认使用 JDK 动态代理(基于接口)或 CGLIB 代理(基于子类),自调用(即同一个类中的方法调用)不会触发代理机制,导致方法 B 的事务传播行为失效。
- 使用的数据库引擎是MyISAM,这个引擎不支持事务。