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注解中自定义了回滚的异常类型 但实际抛出的异常与该类型不匹配,则事务不会回滚
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。