分享MySQL 中的共享鎖和排他鎖的用法

在 mysql 中的行級鎖、表級鎖和頁級鎖中,咱們介紹過,行級鎖是 mysql 中鎖定粒度最細的一種鎖,行級鎖能大大減少數據庫操作的沖突。行級鎖分為共享鎖和排他鎖兩種,本文將詳細介紹共享鎖和排他鎖的概念、使用方式及注意事項。

共享鎖(Share Lock)

共享鎖又稱讀鎖,是讀取操作創(chuàng)建的鎖。其他用戶可以并發(fā)讀取數據,但任何事務都不能對數據進行修改(獲取數據上的排他鎖),直到已釋放所有共享鎖。

如果事務T對數據A加上共享鎖后,則其他事務只能對A再加共享鎖,不能加排他鎖。獲準共享鎖的事務只能讀數據,不能修改數據。

用法

SELECT … LOCK IN SHARE MODE;

在查詢語句后面增加LOCK IN SHARE MODE,MySQL 就會對查詢結果中的每行都加共享鎖,當沒有其他線程對查詢結果集中的任何一行使用排他鎖時,可以成功申請共享鎖,否則會被阻塞。其他線程也可以讀取使用了共享鎖的表,而且這些線程讀取的是同一個版本的數據。

排他鎖(Exclusive Lock)

排他鎖又稱寫鎖、獨占鎖,如果事務T對數據A加上排他鎖后,則其他事務不能再對A加任何類型的封鎖。獲準排他鎖的事務既能讀數據,又能修改數據。

用法

SELECT … FOR UPDATE;

在查詢語句后面增加FOR UPDATE,MySQL 就會對查詢結果中的每行都加排他鎖,當沒有其他線程對查詢結果集中的任何一行使用排他鎖時,可以成功申請排他鎖,否則會被阻塞。

意向鎖(Intention Lock)

意向鎖是表級鎖,其設計目的主要是為了在一個事務中揭示下一行將要被請求鎖的類型。InnoDB 中的兩個表鎖:

  • 意向共享鎖(IS):表示事務準備給數據行加入共享鎖,也就是說一個數據行加共享鎖前必須先取得該表的IS鎖;

  • 意向排他鎖(IX):類似上面,表示事務準備給數據行加入排他鎖,說明事務在一個數據行加排他鎖前必須先取得該表的IX鎖。

意向鎖是 InnoDB 自動加的,不需要用戶干預。

對于INSERT、UPDATE和DELETE,InnoDB 會自動給涉及的數據加排他鎖;對于一般的SELECT語句,InnoDB 不會加任何鎖,事務可以通過以下語句顯式加共享鎖或排他鎖。

共享鎖:SELECT … LOCK IN SHARE MODE;

排他鎖:SELECT … FOR UPDATE;

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享