天天看點

Mysql共享鎖和排他鎖

文章轉載自:https://www.cnblogs.com/boblogsbo/p/5602122.html

不知道圖檔能不能正常顯示

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共享鎖和排他鎖

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

以上為我對mysql中共享鎖與排他鎖的個人了解,有不正确的地方還希望各位指正。

繼續閱讀