若是兩個用戶同時打開一條記錄,修改後提交會產生更新衝突數據庫
辦法有三:併發
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填寫的數據,再在跳轉頁中加載這些數據,保證了用戶不用麻煩再次輸入這些數據,更新成功則清空這些臨時數據