簡體   English   中英

Spring Service中並發更新,其中isolation = REPEATABLE_READ

[英]Concurrent updates in Spring Service with isolation=REPEATABLE_READ

我有一個在事務內部執行並更新一些表的Service方法。 在默認隔離級別,並發更新相互覆蓋。 我不希望發生這種情況,因此我正在考慮切換到REPEATABLE_READ。 這樣,我知道我將在可能的情況下(使用PostgreSQL這樣)從數據庫驅動程序中引發異常。

春季最有效的處理方式是什么? 我似乎沒有內置任何功能,這讓我有些驚訝,但是也許我是在錯誤地看待問題。

就我而言,我試圖找到第一行“可用”進行更新。 我想避免兩個並發事務更新同一行,但是我都希望兩者最終更新一行。 不明智的計划是在Service方法周圍進行一次try / catch,並重試X次,直到更新完成(找到要更新的行或確定沒有要更新的行)。 感覺很手工/笨拙。

一種解決方案是使用隔離級別的序列化事務。 當線程B在線程A啟動事務之后在線程B修改同一記錄並在線程A提交之前提交時,線程A可能引發異常。 我不了解Spring,所以不知道您是否必須自己編寫一個重試機制,或者Spring是否為您這樣做。

另一種解決方案是使用默認隔離級別(已提交讀)。 在表中添加“ modification_count”列。 讀取記錄時,您會記住記錄的修改計數。 更新記錄時,請確保增加修改計數,並且僅在修改計數與讀取記錄時具有相同的值時才進行更新。 因此,當您讀取modification_count = 15的記錄時,請確保更新如下所示:

update TABLE_NAME set value=1234, modification_count=16 where id=1234567 and modification_count=15

檢查更新的行數。 如果更新了一行,則一切正常。 如果刪除了零行,則與此同時另一個線程已更新記錄。 在這種情況下,您必須重試交易。

暫無
暫無

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

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