多用戶同時處理一條數據

場景(問題)描述以下:數據庫

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

姓名:張三,年齡:25oracle

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

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

這樣A的操做就被覆蓋了,姓名又變回「張三」了,你們通常怎麼到處這種狀況?get

這裏給出一個較易用的解決方案原型

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

回放場景效率

0,用戶A、B同時打開一頁面,面頁顯示:原理

姓名:張三,年齡:25,LAST_UPDATE:2008-10-17 13:45:00

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

重點在這裏:更新數據時WHERE條件裏多一條件:AND LAST_UPDATE = '2008-10-17 13:45:00'

更新成功,此時觸發器會將當前時間「2008-10-17 13:46:00」賦值給LAST_UPDATE

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

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

下面要作的就是給出提示了:喔喲,此信息在你發呆這段時間已被人改過啦,因此你須要返工。

 

 

【問題】在之前的系統開發中,常常遇到一個一樣問題,就是多個用戶同時併發操做一條記錄,此次在交易系統開發過程當中,又出現了這樣問題。好比交易商A提交單子,由審覈人員B審覈,此時A正在修改單位,B也正在查看這條記錄,A先修改保存後B再審覈保存,致使B審覈經過的記錄不是他所看到的。

【分析】仔細考慮問題,大概分析了三個方法, 並肯定了一個可行的方案,可能還有不完善的地方,但解決現有問題仍是綽綽有餘的。

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

而後考慮使用悲觀鎖,此次運行時注入原型,併發操做效率提升, 可是,在同步處理數據庫表時又形成鎖表,這樣併發效率依舊很低。

最後考慮樂觀鎖, 只是一種數據版本校驗機制,它不作數據庫層次上的鎖定,須要在要併發操做的主表中加入一個"VERSION"字段或者「LASTUPDATETIME」,若是研究過oracle的SCN應該有殊途同歸之妙,它的原理是這樣:運行時注入原型,這時數據表並不鎖住,只是每次update或insert時將VERSION更新, 當下次update,insert時,會校驗VERSION,若是不一致,此時提示信息已經修改過了,而且在事務控制下rollback,這樣,保證了數據的正確性,而且也不影響併發操做的效率。可是出現的問題是:若是A讀了數據,將來及更新,B先更新了數據, 那麼他將提交不上數據,由於VERSION已經失效,這樣就形成了A從新讀取數據,從新填寫單據信息。 這也是樂觀鎖一個缺點,能夠在更新前臨時保存A填寫的數據,再在跳轉頁中加載這些數據,保證了交易商不用麻煩再次輸入這些數據,更新成功則清空這些臨時數據

相關文章
相關標籤/搜索