事务

介绍spring事务

spring 事务失效场景


一、Spring事务失效的几种常见场景:
  1.  

    方法不是public的:Spring的AOP代理只适用于public方法。如果你的方法不是public,Spring将无法创建代理来管理事务。

  2.  

    方法不是同一个实例的:如果你在方法调用时使用了不同的实例(可能是通过new关键字直接创建的实例,而不是通过Spring容器获取的实例),Spring将无法管理这个方法的事务。

  3.  

    事务方法被静态方法调用:Spring事务需要通过代理类调用事务方法,而静态方法不能被代理。

  4.  

    事务方法内部调用:如果在事务的方法内部调用了另一个方法,且该方法也被声明为事务性方法,内部方法不会参与外部方法的事务。

  5.  

    异常处理不当:默认情况下,Spring事务只有在运行时异常(RuntimeException)和错误(Error)发生时才会回滚。如果捕获了异常并且没有重新抛出,事务不会回滚。

  6.  

    未正确配置@Transactional注解:例如,propagation、isolation等属性设置不当,可能导致事务行为不符合预期。

  7.  

    数据库本身不支持事务:例如,某些数据库如MyISAM不支持事务,若配置在这类数据库上,事务将不会生效。

  8.  

    事务方法未在事务管理的Bean中:如果事务方法不在Spring管理的Bean中,或者没有配置为Bean,事务将不会生效。

  9.  

    方法不是Bean的自己的方法:如果方法是通过类的实例(非Bean实例)调用的,Spring无法创建事务。

  10.  

    异步方法没有正确配置:如果你使用了@EnableAsync和@Async注解,并希望在事务方法中异步执行某些操作,确保异步方法被正确配置,否则事务可能不会按预期工作。

  11. 没有加@Configuration注解

解决这些问题的方法通常涉及到确保方法是public的,确保使用Spring容器管理的Bean,检查@Transactional注解的使用,确保数据库支持事务,并且正确处理异常。

二、图例

image.png