返回
Spring事务控制策略与@Transactional失效问题避坑
后端
2023-11-29 14:39:40
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方法。