首頁  >  文章  >  資料庫  >  mysql的共享鎖與排他鎖詳解

mysql的共享鎖與排他鎖詳解

Guanhui
Guanhui轉載
2020-05-02 10:41:103833瀏覽

mysql鎖定機制分為表格級鎖定和行級鎖定,本文就和大家分享我對mysql中行級鎖定中的共享鎖定與排他鎖進行分享交流。

共享鎖又稱為讀鎖,簡稱S鎖,顧名思義,共享鎖就是多個事務對於同一數據可以共享一把鎖,都能存取到數據,但是只能讀不能修改。

排他鎖又稱為寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他所並存,如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共用鎖和排他鎖,但是取得排他鎖的事務是可以對資料就行讀取和修改。

對於共享鎖大家可能很好理解,就是多個事務只能讀數據不能改數據,對於排他鎖大家的理解可能就有些差別,我當初就犯了一個錯誤,以為排他鎖住一行數據後,其他事務就不能讀取和修改該行數據,其實不是這樣的。排他鎖指的是一個事務在一行資料加上排他鎖後,其他事務不能再在其上加其他的鎖。 mysql InnoDB引擎預設的修改資料語句,update,delete,insert都會自動為涉及的資料加上排他鎖,select語句預設不會加任何鎖定類型,如果加排他鎖可以使用select ...for update語句,加共享鎖可以使用select ... lock in share mode語句。所以加過排他鎖的資料行在其他事務種是不能修改數據的,也不能透過for update和lock in share mode鎖的方式查詢數據,但可以直接透過select ...from...查詢數據,因為普通查詢沒有任何鎖機制。

說了這麼多,咱們來看下以下簡單的例子:

我們有以下測試資料

mysql的共享鎖與排他鎖詳解

 

現在我們對id=1的資料行排他查詢,這裡會使用begin開啟事務,而不會看見我關閉事務,這樣做是用來測試,因為提交事務或回滾事務就會釋放鎖。

開啟一個查詢視窗

 mysql的共享鎖與排他鎖詳解

會查詢到一條數據,現在開啟另一個查詢窗口,對同一資料分別使用排他查和共享鎖定查詢兩種方式查詢

排他查

mysql的共享鎖與排他鎖詳解

共享查

mysql的共享鎖與排他鎖詳解

我們看到開了排他鎖查詢和共享鎖定查詢都會處於阻塞狀態,因為id=1的資料已經被加上了排他鎖,此處阻塞是等待排他鎖釋放。

如果我們直接使用以下查詢呢

mysql的共享鎖與排他鎖詳解

我們看到是可以查詢到資料的。

我們再看一個交易取得了共享鎖,在其他查詢中也只能加共用鎖或不加鎖。

mysql的共享鎖與排他鎖詳解

mysql的共享鎖與排他鎖詳解

mysql的共享鎖與排他鎖詳解

#我們看到是可以查詢資料的,但加排他鎖就查不到,因為排他鎖與共享鎖不能存在同一資料上。

最後我們驗證下上面說的mysql InnoDb引擎中update,delete,insert語句自動加排他鎖的問題,

mysql的共享鎖與排他鎖詳解

此時共享查詢處於阻塞,等待排它鎖的釋放,但是用普通查詢能查到數據,因為沒用上鎖機制不與排他鎖互斥,但查到的數據是修改數據之前的老數據。

mysql的共享鎖與排他鎖詳解

然後我們提交數據,釋放排他鎖定修改後的數據,此時可用排他查,共享查和普通查詢, 因為事務提交後該行數據釋放排他鎖,下面只顯示普通查詢,其他的同學自己去驗證。

mysql的共享鎖與排他鎖詳解

可以看到結果與預期的一樣。

推薦教學:《Mysql教學

以上是mysql的共享鎖與排他鎖詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除