[英]Spring @Transactional Service. What happens if it calls another @Transactional Service?
[英]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.