我有两节课
public class MyTest {
@Autowired
private MyService myService;
private void test() {
myService.writeToDb();
}
}
@Service
public class MyService {
@Transactional
public void writeToDb() {
// do db related stuff
}
}
我想知道从 MyTest 类调用方法 test() (这是一个私有方法)是否会创建一个事务。
附言
我正在使用 Spring Boot。和 Java 17。
无论您是从您内部的公共方法还是私有方法调用另一个对象的方法,它都会起作用,这是一个实现细节。从被调用者的角度来看,它是一样的,它甚至不知道调用者的上下文。
Spring AOP 使用代理模式来处理这些场景。这意味着您不是直接接收一个MyService
bean,而是一个MyServiceSpringCreatedProxy
(不是实际名称,在调试模式下检查,您会看到),它实际上是围绕方法处理事务。
因此,只要调用通过 Spring 的代理,@Transactional
就会按预期计算。请记住,这并不意味着新事务已打开,这取决于另一个事务是否已经存在以及您的配置。
但是,任何自调用(对公共或私有方法)都不会通过代理,然后@Transactional
就无法工作。
@Service
public class MyService {
// can be private, public or whatever
public void callRelatedStuff() {
//self call, no transactional work done
writeToDb();
}
@Transactional
public void writeToDb() {
// do db related stuff
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句