微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当@Transactional(readonly=true) 方法调用@Transactional(readonly=false) 方法时会发生什么,反之亦然?

如何解决当@Transactional(readonly=true) 方法调用@Transactional(readonly=false) 方法时会发生什么,反之亦然?

我想知道,当@Transactional(readonly=true) 方法调用@Transactional(readonly=false) 方法时会发生什么?说一下propagation = Propagation.required(在外层事务范围内)的情况。

public class ServiceA {

   ServiceB serviceB;


   @Transactional(readonly = true)
   public void readOnly() {
       
      // some reading from repo

      serviceB.write()
   }

}


public class ServiceB {

   @Transactional
   public void write() {
     
     // some write to repo

   }

}

相反情况的相同问题,如果@Transactional(readonly=false) 方法调用@Transactional(readonly=true) 方法会发生什么?我想对于最后一种情况,它只会从外部范围考虑 @Transactional(readonly=false)。

解决方法

readOnly=false 调用 readOnly=true 不起作用,因为前一个事务仍在继续。

这是因为之前的交易正在继续。

如果你想让它工作,你必须让它开始一个新的事务。 示例:

public class ServiceB {

   @Transactional(propagation = Propagation.REQUIRES_NEW)
   public void write() {     
     // some write to repo ..
   }
}

在这种情况下,它将起作用,因为将启动一个新的事务

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。