簡體   English   中英

將事務服務注入 Spring 中的另一個事務服務的良好做法是什么?

[英]Is good practice to inject Transactional service to another transactional service in Spring?

我很震驚。 我發現有關將@Service class 注入另一個@Service class 的帖子。 但是如果兩個類都有@Transactional注釋呢? @Transactional ,或者更好的做法是注入存儲庫?

簡單的例子:

@Transactional
@Service
public class BBBServiceImpl implements BBBService {
    
    private final BBBRepository bbbRepository;

    // @Autowired constructor, methods etc...
    
}

第二個 class:

@Transactional
@Service
public class AAAServiceImpl implements AAAService {

    private final AAARepository aaaRepository;
    private final BBBService bbbService;
    
    @Autowired
    public AAAServiceImpl(AAARepository aaaRepository, BBBService bbbService) {
        this.aaaRepository = aaaRepository;
        this.bbbService = bbbService;
    }

    // methods etc...
}

或者更好的解決方案是:

@Transactional
@Service
public class AAAServiceImpl implements AAAService {

    private final AAARepository aaaRepository;
    private final BBBRepository bbbRepository;
    
    @Autowired
    public AAAServiceImpl(AAARepository aaaRepository, BBBRepository bbbRepository) {
        this.aaaRepository = aaaRepository;
        this.bbbRepository= bbbRepository;
    }

    // methods etc...

}

一般來說,不應該是事務性的,而是它們的方法。 如果相關項目需要事務性,您應該應用@Transactional 有時這意味着您將組成多個級別,因為您可以看到即使是單獨的部分也需要@Transactional 有時這意味着堆棧中只有一個級別需要它。 您必須根據您的軟件的邏輯要求來確定。

應用@Transactional有意義的情況是您擁有協調訂單發貨的服務; 標記已發貨訂單和寫入包裹信息的更新應以交易方式進行。 因此, OrderHandlingService#shipParcel應該是@Transactional ,任何涉及數據處理的方法也應該如此

理想情況下,服務層 ( Manager ) 代表您的業務邏輯,因此應該使用@Transactional進行注釋。

服務層可能會調用不同的 DAO 來執行 DB 操作。 讓我們假設一個服務方法中有 3 個 DAO 操作。 如果您的第一個 DAO 操作失敗,其他兩個可能仍會通過,您最終將得到不一致的 DB state。 注釋服務層可以使您免於這種情況。

它也取決於Propagation and Isolation值。

即使您想繼續進行相同的事務,但在服務 B 上,它的傳播是Propagation.REQUIRES_NEW它將創建新事務並執行業務。

是的你可以。 因為您可以在服務中調用另一個服務,即使它是事務性的。 沒問題,推薦

暫無
暫無

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

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