我們先針對mysql資料庫的排他鎖、共享鎖給出下面乙個結論:
結論:(1)共享鎖【s鎖】:又稱讀鎖,若事務t是最早對資料物件a加上s鎖的事務,則事務t可以讀a也能修改a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。 共享鎖使用方式:select … lock in share mode;
(2)排他鎖【x鎖】:又稱寫鎖。若事務t對資料物件a加上x鎖,事務t可以讀a也可以修改a,其他事務不能再對a加任何鎖,直到t釋放a上的鎖。這保證了其他事務在t釋放a上的鎖之前不能再修改a,但可以讀取a。排他鎖使用方式:select … for update;
驗證結論:
目標表(表名:test)結構及初始資料
上述,我們建立了乙個測試表,表名為test,其中,id、a、b、c為該錶的字段,id為表自增欄位。為了防止資料庫自動提交,特別強調,需要設定 set autocommit=0。同時,為了模擬兩個session同時操作同一資料集,我們需要開啟兩個操作視窗進行整個試驗。
兩個session會話,設定autocommit =0
上述,我們建立了兩個視窗,1.mysql 和 2.mysql。下面驗證共享鎖部分的結論:
(1)在1.mysql中執行:select * from test where id=1 lock in share mode;
(2)在2.mysql中執行:select * from test where id=1 for update; 此時執行失敗
(3)在2.mysql中執行:select * from test where id=1 lock in share mode; 執行成功
以上結果表明:若事務t是最早對資料物件a加上s鎖的事務,其他事務只能再對a加s鎖,而不能加x鎖
(4)在1.mysql中執行,select * from test where id=1; 執行成功
(5)在2.mysql中執行,select * from test where id=1; 執行成功
(6)在1.mysql中執行,update test set a=』欄位a-行1-1.mysql修改』 where id=1;執行成功
(7)在2.mysql中執行,update test set a=』欄位a-行1-2.mysql修改』 where id=1;執行失敗,產生死鎖
(8)在1.mysql中執行,commit;提交事務t成功,欄位a的值修改為:欄位a-行1-1.mysql修改
(9)在2.mysql中執行,update test set a=』欄位a-行1-2.mysql修改』 where id=1;執行成功
(10)在2.mysql中執行,commit; 提交事務成功,欄位a的值修改為:欄位a-行1-2.mysql修改
以上結果表明:若事務t是最早對資料物件a加上s鎖的事務,其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。如果其他事務同時對資料新增s鎖,並寫與事務t相同的資料集,很可能會導致死鎖發生。
關於排他鎖的結論部分驗證,讀者可以按相同驗證思維得證,這裡就不再闡述。
(1)因為排他鎖、共享鎖屬於行級鎖,所以,本文基於mysql中的innodb引擎
(2)在驗證的過程中,需設定 set autocommit =0 關閉自動提交
(3)只有執行了commit或rollback後,才認為乙個事務結束
(4)假設id為主鍵,則:(lock in share mode同下)
例1: (明確指定主鍵,並且有此行記錄,row lock)
select * from test where id=1 for update;
select * from test where id=1 and a=』欄位a-行1′ for update;
例2: (明確指定主鍵,若查無此行記錄,無lock)
select * from test where id=』-1′ for update;
例3: (無主鍵,table lock)
select * from test where a=』test』 for update;
例4: (主鍵不明確,table lock)
select * from test where id<>2 for update;
例5: (主鍵不明確,table lock)
select * from test where id like 『%3%』 for update;
mysql 的共享鎖 排它鎖
當我們在運算元據庫時,可能由於多使用者併發導致資料不一致性。而鎖的出現就是通過禁止某些操作在一段時間之內來避免這種資料的不一致性。又稱讀鎖 s 對某一資源加共享鎖,自身可以讀該資源,其他人也可以讀該資源 也可以再繼續加共享鎖,即 共享鎖可多個共存 但無法修改。要想修改就必須等所有共享鎖都釋放完之後。...
sqlserver 資料庫排它鎖 MySQL 鎖
鎖的由來 我們需要最大程度地利用資料庫的併發訪問,還需要確保每個使用者以一致性的方式讀取和修改資料,為解決此問題,有了鎖的機制 innodb 儲存引擎相對比mysql 資料庫的其他儲存引擎在這方面要技高一籌 mysql 常用引擎 innodb myisam memory 鎖機制用於管理對共享資源的併...
mysql的共享鎖與排它鎖
mysql鎖機制分為表級鎖和行級鎖,本文就和大家分享一下我對mysql中行級鎖中的共享鎖與排他鎖進行分享交流。共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙...