簡體   English   中英

Java:從私有方法調用公共事務方法

[英]Java: calling public transactional method from a private method

我有兩節課

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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM