[英]Spring data JPA and transaction management
在我的spring服務中,我調用了兩個spring數據存儲庫方法
@Service
public class ClientService {
public void updateClientByIdAndKey(final Integer id, final String key) {
final Client client = clientRepository.findByIdAndKey(id, key);
// .. Update client details
client.save(client);
}
}
現在我的查詢與事務管理有關。 據我了解並看過代碼,spring存儲庫使用@Transactional為其方法啟用了事務。 對於選擇操作,它具有readonly = true。
我對事務的理解是,當執行select操作然后創建事務然后為保存操作創建另一個事務,因為對於select操作事務是readOnly = true。
我希望在單個事務中執行讀寫操作。 如果我上面的理解是正確的那么@Transactional over service方法updateClientByIdAndKey將在一個事務中運行,這是我的意圖還是將在一個事務中執行兩個操作?
如果我在這里遺漏任何東西,請告訴我。
@Transactional的ReadOnly屬性默認為false。 通過使用Transactional簡單地注釋方法,讀取/選擇操作和更新操作都將在單個事務中發生。 如果您將屬性更改為true,我猜您不會發生兩個事務,而是在嘗試更新時會引發異常。
編輯:如果方法未使用Transactional注釋,則兩個操作都不會在單個事務中執行。 實際上,根據您如何配置ORM,在執行更新時可能會拋出異常,因為連接將在select之后關閉。
當您將@Transactional
注釋添加到updateClientByIdAndKey
方法時,spring將只創建一個讀寫事務(除非您使用PROPAGATION_REQUIRES_NEW
或其他類型的傳播在findByIdAndKey/save
方法上添加額外的@Transactional
注釋。當您向@Transactional
添加readOnly = true
時@Transactional
spring會將Hibernate會話中的flushMode
設置為NEVER
。這意味着你不能執行任何創建,更新,刪除操作。
方法findByIdAndKey不需要做COMMIT(存儲對數據庫的更改),應該注釋為
@Transactional(readOnly = true)
方法updateClientByIdAndKey應該使用
@Transactional
在updateClientByIdAndKey中,只使用一個讀寫事務,除非您的嵌套方法findByIdAndKey定義了
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
在這種情況下,您顯式創建一個沒有意義的新(只讀)事務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.