成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

MYSQL使用鎖解決并發(fā)下的更新丟失問題

brianway / 2005人閱讀

摘要:在層常用的悲觀鎖實現(xiàn)方式是加一個排他鎖。所以為了防止更新丟失可以在時加上加鎖這樣就可以阻止其余事務的但注意無法阻止這樣在操作提交前操作無法獲得排他鎖,從而避免對的重復更新導致的更新丟失。

更新丟失是指并發(fā)下兩次更新同時進行,后一次更新覆蓋了前一次更新的情況,更新丟失是數(shù)據(jù)沒有保證一致性導致的。
舉個栗子:

用戶A在銀行卡有100元錢,某一刻用戶B向A轉(zhuǎn)賬50元(稱為B操作),同時有用戶C向A轉(zhuǎn)賬50元(稱為C操作);

B操作從數(shù)據(jù)庫中讀取他此時的余額100,計算新的余額為100+50=150

C操作也從數(shù)據(jù)庫中讀取他此時的余額100,計算新的余額為100+50=150

B操作將balance=150寫入數(shù)據(jù)庫,之后C操作也將balance=150寫入數(shù)據(jù)庫

最終A的余額變?yōu)?50

上面的例子,A同時收到兩筆50元轉(zhuǎn)賬,最后的余額應該是200元,但卻因為并發(fā)的問題變?yōu)榱?50元,原因是B和C向A發(fā)起轉(zhuǎn)賬請求時,同時打開了兩個數(shù)據(jù)庫會話,進行了兩個事務,后一個事務拿到了前一個事務的中間狀態(tài)數(shù)據(jù),導致更新丟失。
常用的解決思路有兩種:

加鎖同步執(zhí)行

update前檢查數(shù)據(jù)一致性

悲觀鎖

顧名思義,悲觀鎖在讀取數(shù)據(jù)的時候都會認為會有別人去修改,于是在取數(shù)據(jù)的時候會對當前數(shù)據(jù)加一個鎖,在操作結(jié)束前,不允許其余操作更改。要注意悲觀鎖和樂觀鎖都是業(yè)務邏輯層次的定義,不同的設計可能會有不同的實現(xiàn)。在mysql層常用的悲觀鎖實現(xiàn)方式是加一個排他鎖。
排他鎖
查閱資料很多對排他鎖的解釋是:“排他鎖通過在事務中使用select xx for update語句來實現(xiàn),排他鎖會在當前行加一個行級鎖,在當前事務提交前,其余事務無法進行update操作?!?/p>

然而實際上并不是這樣,實際上是加了排他鎖的數(shù)據(jù),在釋放鎖(事務結(jié)束)之前其他事務不能再對該數(shù)據(jù)加鎖
排他鎖之所以能阻止update,delete等操作是因為update,delete操作會自動加排他鎖

也就是說即使加了排他鎖也無法阻止select操作。而select XX for update 語法可以對select 操作加上排他鎖。所以為了防止更新丟失可以在select時加上for update加鎖 這樣就可以阻止其余事務的select for update(但注意無法阻止select)
example:

begin;
select * from account where id = 1 for update;
update account set balance=150 where id =1;
commit;

這樣在B操作提交前,C操作無法獲得排他鎖,從而避免對account的重復更新導致的更新丟失。

樂觀鎖

樂觀鎖是指在獲取數(shù)據(jù)時候不加鎖,樂觀的認為操作不會有沖突,在update的時候再去檢查沖突。
example:

begin;
select balance from account where id=1;
-- 得到balance=100;然后計算balance=100+50=150
update account set balance = 150 where id=1 and balance = 100;
commit;

如上,如果sql在執(zhí)行的過程中發(fā)現(xiàn)update的affected為0 說明balance不等于100即該條數(shù)據(jù)有被其余事務更改過,此時業(yè)務上就可以返回失敗或者重新select再計算

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/17670.html

相關(guān)文章

  • 「Python 面試」第五次更新

    摘要:也就是說當使用字符型存儲數(shù)據(jù)后,該數(shù)據(jù)轉(zhuǎn)換為二進制時的長度超過了位,那么該數(shù)據(jù)將不會完整存儲,會丟失一部分數(shù)據(jù)。 showImg(https://segmentfault.com/img/bVbuYxg?w=3484&h=2480); 閱讀本文大約需要 8 分鐘。 寫在前面 數(shù)據(jù)庫打算只寫 MySQL,Redis 兩部分,不會很細,主要以面試題為主。這次寫的是 MySQL 篇。 1.說...

    zhunjiee 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<