事务隔离应用

一,事务传播介绍

  1. PROPAGATION_REQUIRED:如果不存在外层事务,就主动创建事务;否则使用外层事务
  2. PROPAGATION_SUPPORTS:如果不存在外层事务,就不开启事务;否则使用外层事务
  3. PROPAGATION_MANDATORY:如果不存在外层事务,就抛出异常;否则使用外层事务
  4. PROPAGATION_REQUIRES_NEW:总是主动开启事务;如果存在外层事务,就将外层事务挂起
  5. PROPAGATION_NOT_SUPPORTED:总是不开启事务;如果存在外层事务,就将外层事务挂起
  6. PROPAGATION_NEVER:总是不开启事务;如果存在外层事务,则抛出异常
  7. PROPAGATION_NESTED:如果不存在外层事务,就主动创建事务;否则创建嵌套的子事务

二,@Transactional事务的传播机制

不同的业务场景需要不用的事务传播机制. (eg当前事务中又嵌套了另一个事务,这个时候是选择重新开启一个事务,还是使用原来的事务,或挂起外层事务以非事务运行单独的逻辑).

@Transactional(propagation=Propagation.REQUIRED)
如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)

@Transactional(propagation=Propagation.NOT_SUPPORTED)
容器不为这个方法开启事务

@Transactional(propagation=Propagation.REQUIRES_NEW)
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务

@Transactional(propagation=Propagation.MANDATORY)
必须在一个已有的事务中执行,否则抛出异常

@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)

@Transactional(propagation=Propagation.SUPPORTS)
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

eg:

三,失效场景

  1. 注解没有被正确的扫描和解析:确保 @Transactional 注解已经被正确加入到 Spring 的组件扫描路径中。

  2. 方法不是公开的@Transactional 只能应用到公开的方法上。如果方法不是公开的(例如:私有、保护),事务将不会被创建或者应用。

  3. 方法不是被同一个类中的方法调用:如果一个方法不是通过同一个类中的另一个方法调用,@Transactional 注解将不会被继承。

  4. 异常处理不当:默认情况下,@Transactional 只有在运行期间遇到RuntimeExceptionError时才会回滚。如果捕获了异常并且没有重新抛出,事务将不会回滚。可以通过设置 rollbackFor 属性来改变这个行为。

  5. 事务管理器配置问题:确保已经配置了正确的事务管理器,并且已经被正确地注册到了 Spring 上下文中。

  6. 方法不是被代理类调用:如果事务方法没有通过代理类调用,事务将不会被创建。这可以通过确保在事务方法之外的地方不要调用它,或者通过显式地获取代理对象来调用方法来解决。

  7. 注解被覆盖:如果在类的层次结构中,有多个相同的注解,并且属性设置不一致,子类的注解可能会覆盖父类的注解。

  8. Caching Proxies:在某些情况下,Spring 事务框架可能会使用缓存代理,这可能导致事务行为不符合预期。可以通过设置 -Dspring.aop.proxy-target-class=false 来强制使用基于接口的代理。

  9. 多线程和事务:在多线程环境下,每个线程都有自己的事务上下文,因此,如果你在一个新的线程中调用一个带有 @Transactional 注解的方法,事务将不会被继承。

  10. 异步方法和事务:如果你在 @Transactional 方法中启动了一个异步任务,事务不会被自动传播到异步执行的任务中。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值