[英]Spring-Hibernate Transactional Read-only propagation
我閱讀了關於事務傳播和只讀的內容。
但是有一點我不清楚。
假設我有這個代碼:
@Transactional(readOnly = true)
public void first() {
second();
}
@Transactional
public void second() {
//do Something
}
會發生什么?
第一種方法會被掛起,因為它不能被刷新/提交,而第二種方法需要嗎?
或者也許“只讀”也傳播到內部調用? (因為我處於“必需”傳播模式)?
您在@Transactional
注釋上定義了一個稱為progagation
的功能。
有兩個選項可以適應內部事務場景
NESTED
:
如果當前事務存在,則在嵌套事務中執行,其他行為類似於 PROPAGATION_REQUIRED。 EJB 中沒有類似的特性。 注意:嵌套事務的實際創建僅適用於特定的事務管理器。 開箱即用,這僅適用於處理 JDBC 3.0 驅動程序時的 JDBC DataSourceTransactionManager。 一些 JTA 提供者也可能支持嵌套事務。
需要_新
PROPAGATION_REQUIRES_NEW 為給定范圍啟動一個新的、獨立的“內部”事務。 此事務將完全獨立於外部事務提交或回滾,具有自己的隔離范圍,自己的一組鎖等。外部事務將在內部事務開始時暫停,並在內部事務完成后恢復完全的。
由於外部事務被標記為readOnly
則NESTED
選項沒有意義,因為內部事務的提交依賴於外部事務......而外部事務不允許發生任何更改......
所以在我看來只有
@Transaction(propagation = Propagation.REQUIRES_NEW)
public void second(..)
在這種情況下是有道理的。
只是強調.. 這在理論上應該有效.. 有很多因素需要考慮.. 數據庫功能、庫版本等.. 你必須做一些進一步的測試,但希望這能給你一個想法。
更新
為了繞過這個..嘗試制作另一個..更高級別的服務,它不會是事務性的..然后你可以注入較低級別的服務並按順序執行調用而不會出現嵌套事務問題:
@Service
public class FacadeService{
@Autowired
private TransactionalService service;
public void perform(..){
service.first();
service.second();
...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.