0
点赞
收藏
分享

微信扫一扫

Spring默认支持的事务传播机制和事务隔离级别

栖桐 2022-02-09 阅读 64

事务传播机制

用来控制方法之间事务的传播行为,如a方法调用b方法,a方法开启了事务,b方法也需要事务。这时候需要判断b方法是使用a方法的事务,还是单独开启新的事务。Spring @Transactional注解中可以通过propagation属性设置

  • 使用原事务:Propagation.REQUIRED
  • 开启新事务: Propagation.REQUIRES_NEW

注意⚠️: 本类方法互调会出现事务配置失效!场景如下

   @Transactional(propagation = Propagation.REQUIRED, timeout = 30)
   public void a() {
       b();
       c();
   }

   @Transactional(propagation = Propagation.REQUIRED, timeout = 5)
   public void b() {

   }

   @Transactional(propagation = Propagation.REQUIRES_NEW, timeout = 10)
   public void c() {

   }

某个服务类的三个事务方法,都设置了事务传播行为和超时时间。使用默认spring事务方法时,方法b和方法c的设置都会失效。原因是@Transactional事务注解是通过代理对象实现的,直接在本类中调用,可以看作this.b()、this.c(),会绕过代理对象。解决方案如下:
在这里插入图片描述
启动类使用@EnableAspectJAutoProxy(exposeProxy = true)注解,并设置暴露代理对象
在这里插入图片描述
调用时首先获取当前Service类对应的代理对象,使用代理对象调用方法即可生效

事务隔离级别

Spring @Transactional注解中可以通过isolation属性设置事务隔离级别

  • Isolation.READ_COMMITTED:读提交,解决脏读
  • Isolation.REPEATABLE_READ:可重复读,解决幻读
举报

相关推荐

0 条评论