在MySQL 中的行級鎖定、表格級鎖定和頁級鎖定中,咱們介紹過,行級鎖定是MySQL 中鎖定粒度最細的一種鎖定,行級鎖能大大減少資料庫操作的衝突。行級鎖分為共享鎖和排他鎖兩種,本文將詳細介紹共享鎖和排他鎖的概念、使用方式及注意事項。
共享鎖定又稱為讀鎖,是讀取操作所建立的鎖定。其他使用者可以並發讀取數據,但任何事務都不能對數據進行修改(獲取數據上的排他鎖),直到已釋放所有共享鎖。
如果交易T
對資料A
加上共用鎖定後,則其他交易只能對A
再加共用鎖,不能加排他鎖。獲準共享鎖的事務只能讀數據,不能修改數據。
用法
SELECT ... LOCK IN SHARE MODE;
在查詢語句後面增加LOCK IN SHARE MODE
,MySQL 會對查詢結果中的每行都加共用鎖,當沒有其他執行緒對查詢結果集中的任何一行使用排他鎖時,可以成功申請共用鎖定,否則會被阻塞。其他執行緒也可以讀取使用了共享鎖的表,而這些執行緒讀取的是同一個版本的資料。
排他鎖又稱寫鎖、獨佔鎖,如果交易T
對資料A
加上排他鎖後,則其他事務不能再對A
加任何類型的封鎖。獲準排他鎖的事務既能讀取數據,又能修改數據。
用法
SELECT ... FOR UPDATE;
在查詢語句後面增加FOR UPDATE
,MySQL 會對查詢結果中的每行都加排他鎖,當沒有其他執行緒對查詢結果集中的任何一行使用排他鎖時,可以成功申請排他鎖,否則會被阻塞。
意向鎖是表級鎖,其設計目的主要是為了在一個事務中揭示下一行將要被請求鎖的類型。 InnoDB 中的兩個表鎖定:
意向共享鎖定(IS):表示交易準備在資料行中加入共享鎖定,也就是說一個資料行加上共享鎖定前必須先取得表格的IS
鎖定;
意向排他鎖(IX):類似上面,表示交易準備給資料行加入排他鎖,說明交易在一個資料行加排他鎖前必須先取得該表的IX
鎖定。
意向鎖定是 InnoDB 自動加總的,不需要使用者乾預。
對於INSERT
、UPDATE
和DELETE
,InnoDB 會自動為涉及的資料加上排他鎖定;對於一般的SELECT
語句,InnoDB 不會加任何鎖,交易可以透過以下語句明確加上共用鎖定或排他鎖。
共享鎖定:SELECT ... LOCK IN SHARE MODE;
#排他鎖:SELECT ... FOR UPDATE;
以上是分享MySQL 中的共用鎖定和排他鎖的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!