我有兩節課
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。
uj5u.com熱心網友回復:
無論您是從您內部的公共方法還是私有方法呼叫另一個物件的方法,它都會起作用,這是一個實作細節。從被呼叫者的角度來看,它是一樣的,它甚至不知道呼叫者的背景關系。
Spring AOP 使用代理模式來處理這些場景。這意味著您不是直接接收一個MyServicebean,而是一個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
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484442.html
上一篇:RestTemplateJunit:無法呼叫“org.springframework.http.ResponseEntity.getBody()”,因為“response”為空
下一篇:使用角度提交后如何重置表單?
