共享鎖(Share Lock)
共享鎖又稱讀鎖,簡稱 S 鎖:一個事務獲取了一個數據行的共享鎖,其他事務能獲得該行對應的共享鎖,但不能獲得排他鎖,即一個事務在讀取一個數據行的時候,其他事務可以併發讀取數據,但不能對該數據行進行增刪改,直到已釋放所有共享鎖
如果事務 T 對數據 A 加上共享鎖後,則其他事務只能對 A 再加共享鎖,不能加排他鎖。獲取共享鎖的事務只能讀數據,不能修改數據
在查詢語句後面增加LOCK IN SHARE MODE
,MySQL 會對查詢結果中的每行都加共享鎖,當沒有其他線程對查詢結果集中的任何一行使用排他鎖時,可以成功申請共享鎖,否則會被阻塞。其他線程也可以讀取使用了共享鎖的表,而且這些線程讀取的是同一個版本的數據
排他鎖(eXclusive Lock)
排他鎖又稱寫鎖,簡稱 X 鎖:一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖(排他鎖或者共享鎖),即一個事務在讀取一個數據行的時候,其他事務不能對該數據行進行增刪改查
如果事務 T 對數據 A 加上排他鎖後,則其他事務不能再對 A 加任何類型的封鎖。獲取排他鎖的事務既能讀數據,又能修改數據
在查詢語句後面增加FOR UPDATE
,MySQL 會對查詢結果中的每行都加排他鎖,當沒有其他線程對查詢結果集中的任何一行使用排他鎖時,可以成功申請排他鎖,否則會被阻塞
意向鎖
意向鎖是表級鎖,其設計目的主要是爲了在一個事務中揭示下一行將要被請求鎖的類型。InnoDB 中的兩個表鎖:
意向共享鎖(IS):表示事務準備給數據行加入共享鎖,也就是說一個數據行加共享鎖前必須先取得該表的 IS 鎖。如果需要對記錄 A 加共享鎖,那麼此時 InnoDB 會先找到這張表,對該表加意向共享鎖之後,再對記錄 A 添加共享鎖
意向排他鎖(IX):類似上面,表示事務準備給數據行加入排他鎖,也就是說事務在給一個數據行加排他鎖前必須先取得該表的 IX 鎖。如果需要對記錄 A 加排他鎖,那麼此時 InnoDB 會先找到這張表,對該表加意向排他鎖之後,再對記錄 A 添加排他鎖
意向鎖是 InnoDB 自動加的,不需要用戶干預
注意點
- 對於 insert、update、delete,InnoDB 會自動給涉及的數據加排他鎖(X),只有查詢 select 需要我們手動設置排他鎖
- 對於一般的 select 語句,InnoDB 不會加任何鎖,也就是可以多個併發去進行 select 的操作,不會有任何的鎖衝突,因爲根本沒有鎖
如何設置共享鎖和排他鎖?
共享鎖:SELECT ... LOCK IN SHARE MODE;
排他鎖:SELECT ... FOR UPDATE;
總結
-
共享鎖和排他鎖,系統在特定的條件下會自動添加共享鎖或者排他鎖,也可以手動添加共享鎖或者排他鎖。
意向共享鎖和意向排他鎖都是系統自動添加和自動釋放的,整個過程無需人工干預 -
共享鎖和排他鎖都是鎖的行記錄,意向共享鎖和意向排他鎖鎖定的是表