1. 程式人生 > >深入Mysql鎖機制(三)共享鎖與排他鎖

深入Mysql鎖機制(三)共享鎖與排他鎖

深入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;