深入Mysql鎖機制(三)共享鎖與排他鎖
阿新 • • 發佈:2018-12-06
深入Mysql鎖機制(三)共享鎖與排他鎖
共享鎖(Share Lock)
共享鎖又稱讀鎖,是讀取操作建立的鎖。其他使用者可以併發讀取資料,但任何事務都不能對資料進行修改(獲取資料上的排他鎖),直到已釋放所有共享鎖。
如果事務T對資料A加上共享鎖後,則其他事務只能對A再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀資料,不能修改資料。
用法
SELECT ... LOCK IN SHARE MODE;
在查詢語句後面增加LOCK IN SHARE MODE
,Mysql會對查詢結果中的每行都加共享鎖,當沒有其他執行緒對查詢結果集中的任何一行使用排他鎖時,可以成功申請共享鎖,否則會被阻塞。其他執行緒也可以讀取使用了共享鎖的表,而且這些執行緒讀取的是同一個版本的資料。
排他鎖(eXclusive Lock)
共享鎖又稱寫鎖,如果事務T對資料A加上排他鎖後,則其他事務不能再對A加任任何型別的封鎖。獲准排他鎖的事務既能讀資料,又能修改資料。
用法
SELECT ... FOR UPDATE;
在查詢語句後面增加FOR UPDATE
,Mysql會對查詢結果中的每行都加排他鎖,當沒有其他執行緒對查詢結果集中的任何一行使用排他鎖時,可以成功申請排他鎖,否則會被阻塞。
意向鎖
InnoDB還有兩個表鎖:
-
意向共享鎖(IS):表示事務準備給資料行加入共享鎖,也就是說一個數據行加共享鎖前必須先取得該表的IS鎖
-
意向排他鎖(IX):類似上面,表示事務準備給資料行加入排他鎖,說明事務在一個數據行加排他鎖前必須先取得該表的IX鎖。
意向鎖是InnoDB自動加的,不需要使用者干預。
對於insert、update、delete,InnoDB會自動給涉及的資料加排他鎖(X);對於一般的Select語句,InnoDB不會加任何鎖,事務可以通過以下語句給顯示加共享鎖或排他鎖。
-
共享鎖:
SELECT ... LOCK IN SHARE MODE;
-
排他鎖:
SELECT ... FOR UPDATE;