簡體   English   中英

Spring數據JPA和事務管理

[英]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.

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