多用戶同時修改一條數據 ,併發問題

 

若是兩個用戶同時打開一條記錄,修改後提交會產生更新衝突數據庫

辦法有三:併發

1.打開同時鎖定表的記錄 性能

2.用lock對修改方法加鎖spa

2.捕獲錯誤,撤消其中一個用戶的修改同步

 

場景描述以下:效率

用戶A、B同時打開一個頁面,頁面顯示,客戶表T_CUSTOMER字段(C_NAME、C_AGE)表單

姓名:張三,年齡:25方法

1,A 將姓名「張三」改成「張三1」,而後保存數據

2,B 將年齡「25」改成「30」,而後保存查詢

這樣A的操做就被覆蓋了,姓名又變回「張三」了

 

解決方案

方法一:

鎖表,可是被鎖的表能夠被查詢   卻不能增,刪,改表,雖可以防止丟失更新和不可重複寫這類併發問題,可是它會影響併發性能

 

方法二:

在業務代碼中用lock對修改方法加鎖,運行時注入單例,而且對方法加同步鎖,保證了業務數據的正確性, 可是效率低下,用戶在使用中不方便,背離了系統能夠併發操做的原則

 

方法三:

數據校驗機制,不作數據庫層次上的鎖定

給表添加一字段:LAST_UPDATE,即最後更新時間

姓名:張三,年齡:25,LAST_UPDATE:2016-06-17 13:45:00

 

1,A 將姓名「張三」改成「張三1」,而後保存

更新數據時WHERE條件裏多一條件:AND LAST_UPDATE = '2016-06-17 13:45:00'

修改記錄時同時將當前時間「2016-10-17 13:46:00」賦值給LAST_UPDATE字段,更新成功

2,B 將年齡「25」改成「30」,而後保存

B更新數據時WHERE條件裏也有這個條件:AND LAST_UPDATE = '2016-06-17 13:45:00',此時LAST_UPDATE的值已經在A修改記錄時變成2016-06-17 13:46:00

下面要作的就是給出提示了:該記錄讀出後已經被再次修改

 

備註:若是A讀了數據,將來及更新,B先更新了數據, 那麼A將提交不上數據,由於LAST_UPDATE 已經失效,這樣就形成了A從新讀取數據,從新填寫表單信息。 這也是樂觀鎖一個缺點,能夠在更新前臨時保存A填寫的數據,再在跳轉頁中加載這些數據,保證了用戶不用麻煩再次輸入這些數據,更新成功則清空這些臨時數據

相關文章
相關標籤/搜索