中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql悲觀鎖和樂觀鎖舉例分析

發布時間:2021-12-14 14:59:32 來源:億速云 閱讀:130 作者:iii 欄目:大數據

本篇內容介紹了“mysql悲觀鎖和樂觀鎖舉例分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

背景

考慮下面兩個并發帶來的問題:

1、丟失更新:一個事務的更新結果覆蓋了其它事務的更新結果,即所謂的更新丟失。

2、臟讀:當一個事務讀取其它完成一半事務的記錄時,就會發生臟讀取。

例如:

兩個用戶同時修改商品庫存表,A、B同時進入,看到的庫存都是100,A購買一件把庫存修改為99(100-1)。此時B購買兩件把庫存修改為98(100-2),因為A、B同時讀到的庫存都是100,B并不能看到A做的庫存更新,所以造成B臟讀,造成A丟失更新。

所以為了解決這些并發帶來的問題。 我們需要引入并發控制機制--鎖。

鎖分類

悲觀鎖

悲觀鎖就是用戶修改數據時看起來很悲觀,保守態度,擔心別的用戶會同時修改這條數據,所以每次修改時會提前把這條數據鎖定起來,只有自己可修改(但別的用戶可以讀),等自己修改完了再釋放鎖。

樂觀鎖

樂觀鎖就是用戶修改數據時心態很樂觀,不管別人修改不修改數據,我都不上鎖,我修改的時候判斷下數據有沒有發生變化,沒發生變化我就會更新成功,發生變化了就不會更新成功我再去重試之前的動作直到更新成功。

鎖應用

悲觀鎖

使用悲觀鎖的時候我們首先必須關閉mysql數據庫的自動提交屬性,因為MySQL默認使用autocommit模式,也就是說,當你執行一個更新操作后,MySQL會立刻將結果進行提交。

關閉命令為:set autocommit=0;

悲觀鎖一般使用select…for update實現,在執行的時候會鎖定數據,雖然會鎖定數據,但是不影響其他事務的普通查詢使用。

在我們使用悲觀鎖的時候事務中的語句例如:

//開始事務

begin;/begin work;/start transaction; (三選一)

//查詢信息

select * from order where id=1 for update;

//修改信息

update order set name='names';

//提交事務

commit;/commit work;(二選一)

此處的查詢語句for update關鍵字,在事務中只有SELECT ... FOR UPDATE 或LOCK IN SHARE MODE 同一條數據時會等待其它事務結束后才執行,一般的SELECT查詢則不受影響。

注意事項

執行事務時關鍵字select…for update會鎖定數據,防止其他事務更改數據。但是鎖定數據也是有規則的。

查詢條件與鎖定范圍:

1、具體的主鍵值為查詢條件

比如查詢條件為主鍵ID=1等等,如果此條數據存在,則鎖定當前行數據,如果不存在,則不鎖定。

2、不具體的主鍵值為查詢條件

比如查詢條件為主鍵ID>1等等,此時會鎖定整張數據表。

3、查詢條件中無主鍵

會鎖定整張數據表。

4、如果查詢條件中使用了索引為查詢條件

明確指定索引并且查到,則鎖定整條數據。如果找不到指定索引數據,則不加鎖。

樂觀鎖

1、使用自增長的整數表示數據版本號,更新時檢查版本號是否一致,比如數據庫中數據版本為666,更新提交時version=666+1,使用該version值(=667)與數據庫version+1(=667)作比較,如果相等,則可以更新,如果不等則有可能其他程序已更新該記錄,所以返回錯誤或者發起重試動作。

例如表

student(id,name,version)

1     a       1

當事務一進行更新操作:update student set name='txt' where id = #{id} and version = #{version};

此時操作完后數據會變為id = 1,name = txt,version = 2,當另外一個事務二同樣執行更新操作的時候,卻發現version != 1,此時事務二就會操作失敗,從而保證了數據的正確性。

2、使用時間戳來實現,原理同上。

3、使用其他數據庫字段,如:金額,更新時添加條件判斷金額是否變化,原理同上。

樂觀鎖圖示

mysql悲觀鎖和樂觀鎖舉例分析

“mysql悲觀鎖和樂觀鎖舉例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

历史| 奉节县| 河间市| 邯郸县| 永吉县| 巩留县| 郯城县| 综艺| 巨野县| 霍林郭勒市| 常州市| 安化县| 阿城市| 通城县| 镇安县| 波密县| 马尔康县| 观塘区| 土默特左旗| 永定县| 台中县| 昌邑市| 伊通| 龙胜| 皮山县| 汉源县| 翁牛特旗| 长寿区| 永春县| 柯坪县| 马鞍山市| 定襄县| 洛扎县| 房产| 巩义市| 神农架林区| 苏尼特左旗| 武穴市| 苍梧县| 铁岭县| 扬州市|