併發的更新同乙個表,使用事務預防併發問題的三個實現

2021-08-08 03:57:58 字數 647 閱讀 4471

答案是,看你怎麼實現了。

1. 比較蠢的實現。

a事務:select將要變更的資料,在記憶體中對將要更新的字段進行運算,最後使用update table set value=calculateresult where id='';的方式更新這條記錄。

b事務,也用同樣的方式實現更新。

併發的時候,ab事務併發會產生問題,比如原始value=400,a、b兩個事務都要增加100,最後可能執行的結果是value=500;

2. 比較ok的實現

在1的基礎上使用 select for update; a,b事務併發時候,b事務無法獲取鎖,會保持等待直到a事務結束,可以保證資料併發更新的準確性。但是等待比較浪費資源,併發承受能力較低。

3. 這裡推薦的實現。

使用增量方式更新。先不查詢記錄在資料庫中的數值,先在記憶體中計算本次應該增減的數值y,計算完成後,使用update table set value = value+y where id=''; 的方式進行更新。這樣做的方式是在乙個事務中減少了一次查詢,僅僅進行了一次更新操作,多事務併發時候,由於update操作對該條記錄加鎖,其他事務會等待直至本事務結束,不會出現資料併發問題,相對2,減少理我鎖定時間,增強了系統的併發水平。

因為在生產中,遇到了這個問題,就來記錄一下,免得像我一樣的新手踩坑。

多執行緒併發同乙個表問題

table for update for update of a.id a1.有where條件時,鎖定條件中指定的資料行 行級封鎖 2.無where條件是,鎖定表a 表級封鎖 1.有where條件時,鎖定條件中指定的資料行 行級封鎖 2.無where條件是,鎖定表a 表級封鎖 a,b直接封鎖a,b表...

VS同乙個專案屬性表的使用

最近在用vs2013開發kinect程式,使用了很多庫,比如 opencv pcl opengl 在網上找了很多別人寫的程式,根據不同人使用的庫,開啟.sln檔案後,總是要重新配置屬性表 專案 右鍵 屬性 如下 於是網上找了一下,有啥辦法沒有!結果每個專案都可以使用已有的很多屬性表,然後會繼承這個屬...

多個請求使用同乙個Servlet

如果jsp中乙個請求對應乙個servlet那要建很多servlet,冗餘較多。我們可以把乙個模組的請求封裝在乙個servlet,實現功能的模組化,從而簡化 其實這種方式有點類似於struts中的action。新建jsp檔案 輸入如下 分別是3個請求,請求同乙個servlet,但是後邊跟的引數meth...