当@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 ..
   }
}

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