Spring事务常见的失效场景说明
下文笔者讲述Spring中事务失效的场景说明,如下所示
Spring失效的场景说明
1.自调用:
当类中方法调用本类中另一个方法时
如果调用时,使用this调用
则此时this并不是代理对象
而是实际的类实例
因此,事务不会生效
优化此问题的方法是
从Spring的IoC容器中获取该类的代理对象
并通过代理对象来调用方法
方法访问权限问题
Spring要求被代理的方法必须是public
如果方法不是public的,事务将不会生效
此外,如果方法被final修饰
Spring的动态代理无法代理final方法,因此事务也会失效。
数据库不支持事务
某些数据库引擎(如MySQL的MyISAM引擎)不支持事务
因此即使Spring配置了事务
这些操作也不会在事务中执行。
方法没有被Spring管理
当类没有被Spring管理(即没有添加@Controller、@Service、@Repository等注解)
则类下面的方法不会被Spring的事务管理器控制
因此事务不会生效。
异常处理不当
如果在事务方法中发生异常
并且该异常没有被Spring的事务管理器捕获
则事务不会回滚
此外,对于非RuntimeException(即checked异常)
Spring默认不会回滚事务,除非在@Transactional注解中明确指定了rollbackFor属性。
多线程调用
由于Spring的事务管理是基于ThreadLocal的
不同线程间的事务是隔离
因此,当一个线程中开启事务
然后在另一个线程中执行数据库操作,那么这些操作不会参与之前线程的事务。
错误的传播属性
@Transactional注解有一个propagation属性,用于指定事务的传播行为。如果使用了错误的传播属性,可能导致事务的行为不符合预期。
自定义了回滚异常与事务回滚异常不一致
如果在@Transactional注解中自定义了回滚的异常类型
但实际抛出的异常与该类型不匹配,则事务不会回滚
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


