【问题标题】:What happens when @Transactional(readonly=true) method calls @Transactional(readonly=false) method and vice versa?当@Transactional(readonly=true) 方法调用@Transactional(readonly=false) 方法时会发生什么,反之亦然?
【发布时间】:2021-04-23 15:38:06
【问题描述】:

我想知道,当@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)。

【问题讨论】:

    标签: java spring transactions readonly


    【解决方案1】:

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

    这是因为之前的事务正在继续。

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

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

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

    【讨论】:

    • 感谢您的回答!但是在我的情况下会发生什么 - 会引发异常?
    • 写入不发生。 @Alexey
    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2017-06-06
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多