您好,登錄后才能下訂單哦!
這篇文章主要介紹“mysql樂觀鎖如何實現”,在日常操作中,相信很多人在mysql樂觀鎖如何實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”mysql樂觀鎖如何實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在mysql中,可以利用數據版本Version記錄機制實現樂觀鎖,給數據表加一個version字段,每操作一次記錄的版本號加一,判斷version的值是否與剛查詢的值相等,若相等則執行更新,若不相等則不進行更新。
本教程操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
實現方法
1、用數據版本Version記錄機制實現,這是樂觀鎖最常用的一種實現方式。
2、數據版本,即為數據增加一個版本標識,一般是通過為數據庫表增加一個數字類型的 version字段來實現。當讀取數據時,將version字段的值一同讀出,數據每更新一次,對此version值加1。當我們提交更新的時候,判斷數據庫表對應記錄的當前版本信息與第一次取出來的version值進行比對,如果數據庫表當前版本號與第一次取出來的version值相等,則予以更新,否則認為是過期數據。
實例
update TABLE set value=2,version=version+1 where id=#{id} and version=#{version}
樂觀鎖不是數據庫自帶的,需要我們自己去實現。
樂觀鎖是指操作數據庫時(更新操作),想法很樂觀,認為這次的操作不會導致沖突,在操作數據時,并不進行任何其他的特殊處理(也就是不加鎖),而在進行更新后,再去判斷是否有沖突了。整體思想就是CAS思想。
通常實現是這樣的:在表中的數據進行操作時(更新),先給數據表加一個版本(version)字段,每操作一次,將那條記錄的版本號加1。也就是先查詢出那條記錄,獲取出version字段,如果要對那條記錄進行操作(更新),則先判斷此刻version的值是否與剛剛查詢出來時的version的值相等,如果相等,則說明這段期間,沒有其他程序對其進行操作,則可以執行更新,將version字段的值加1;如果更新時發現此刻的version值與剛剛獲取出來的version的值不相等,則說明這段期間已經有其他程序對其進行操作了,則不進行更新操作。
eg:
下單操作包括3步驟:
1、查詢出庫存信息:
select (id,count,version) from t_goodsku where id=#{id}
2、扣減2個庫存:
程序中計算:count = count - 2;
3、更新庫存:
update t_goodsku set count={count},version=version+1 where id=#{id} and version=#{version};
第1步中查到的version其實是快照(read-commited和read-repeatable隔離機制下的MVCC機制),在這種情況下,第3步去update時,獲取鎖,where條件中進行判斷中的version=#{version},其實是拿當前version和第1步中的快照version進行比對
如果比對成功,說明在這段時間內這條數據沒有被其他線程更新過,update成功;
如果對比失敗,說明這段時間內這條數據被更新過,那么update失敗,報錯回滾或自旋。
當然,這里是為了模擬樂觀鎖的場景,實際上更新庫存時一步便可以實現:
更新庫存:
update t_goodsku set count=count -2 where id=#{id};
到此,關于“mysql樂觀鎖如何實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。