返回

Spring事务控制策略与@Transactional失效问题避坑

后端

Spring事务控制策略

Spring提供了多种事务控制策略,主要包括:

  • REQUIRED :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是最常用的事务控制策略。
  • REQUIRES_NEW :创建一个新的事务,并且使当前事务暂停。
  • NESTED :在当前事务中创建一个子事务。子事务可以独立提交或回滚,而不会影响父事务。
  • SUPPORTS :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行操作。
  • NOT_SUPPORTED :以非事务方式执行操作,即使当前存在事务。
  • NEVER :如果当前存在事务,则抛出异常;如果当前没有事务,则以非事务方式执行操作。

Spring事务隔离级别

Spring也提供了多种事务隔离级别,主要包括:

  • READ_UNCOMMITTED :事务可以读取其他事务未提交的数据。
  • READ_COMMITTED :事务只能读取其他事务已提交的数据。
  • REPEATABLE_READ :事务可以读取其他事务已提交的数据,并且在事务期间不会出现幻读。
  • SERIALIZABLE :事务可以读取其他事务已提交的数据,并且在事务期间不会出现幻读或脏读。

Spring事务传播行为

Spring还提供了多种事务传播行为,主要包括:

  • PROPAGATION_REQUIRED :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • PROPAGATION_REQUIRES_NEW :创建一个新的事务,并且使当前事务暂停。
  • PROPAGATION_NESTED :在当前事务中创建一个子事务。子事务可以独立提交或回滚,而不会影响父事务。
  • PROPAGATION_SUPPORTS :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行操作。
  • PROPAGATION_NOT_SUPPORTED :以非事务方式执行操作,即使当前存在事务。
  • PROPAGATION_NEVER :如果当前存在事务,则抛出异常;如果当前没有事务,则以非事务方式执行操作。

@Transactional失效问题避坑

在使用@Transactional时,可能会遇到一些失效问题,主要原因包括:

  • 没有在类上或方法上添加@Transactional注解 :这是最常见的原因。
  • 使用了错误的事务控制策略或传播行为 :需要根据实际情况选择合适的事务控制策略和传播行为。
  • 事务方法抛出异常 :如果事务方法抛出异常,则事务将回滚。
  • 使用了非托管实体 :如果使用的是非托管实体,则事务将无法管理该实体。
  • 使用了静态方法或final方法 :静态方法和final方法无法被Spring AOP拦截,因此无法使用@Transactional注解。

为了避免这些失效问题,需要在使用@Transactional时注意以下几点:

  • 确保在类上或方法上添加了@Transactional注解。
  • 根据实际情况选择合适的事务控制策略和传播行为。
  • 避免在事务方法中抛出异常。
  • 避免使用非托管实体。
  • 避免使用静态方法或final方法。