您好,登錄后才能下訂單哦!
mysql中怎么實現共享鎖和排他鎖,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
共享鎖又稱讀鎖,簡稱 S 鎖:一個事務獲取了一個數據行的共享鎖,其他事務能獲得該行對應的共享鎖,但不能獲得排他鎖,即一個事務在讀取一個數據行的時候,其他事務可以并發讀取數據,但不能對該數據行進行增刪改,直到已釋放所有共享鎖
如果事務 T 對數據 A 加上共享鎖后,則其他事務只能對 A 再加共享鎖,不能加排他鎖。獲取共享鎖的事務只能讀數據,不能修改數據
在查詢語句后面增加LOCK IN SHARE MODE
,MySQL 會對查詢結果中的每行都加共享鎖,當沒有其他線程對查詢結果集中的任何一行使用排他鎖時,可以成功申請共享鎖,否則會被阻塞。其他線程也可以讀取使用了共享鎖的表,而且這些線程讀取的是同一個版本的數據
排他鎖又稱寫鎖,簡稱 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;
共享鎖和排他鎖,系統在特定的條件下會自動添加共享鎖或者排他鎖,也可以手動添加共享鎖或者排他鎖。
意向共享鎖和意向排他鎖都是系統自動添加和自動釋放的,整個過程無需人工干預
共享鎖和排他鎖都是鎖的行記錄,意向共享鎖和意向排他鎖鎖定的是表
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。