讀懂mysql讀鎖(共享鎖)與寫鎖(排他鎖)

讀鎖又稱為共享鎖,簡稱S鎖,顧名思義,共享鎖就是多個事務對于同一數(shù)據(jù)可以共享一把鎖,都能訪問到數(shù)據(jù),但是只能讀不能修改。

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

共享鎖 很好理解,就是多個事務只能讀數(shù)據(jù)不能改數(shù)據(jù)。

排他鎖 指的是一個事務在一行數(shù)據(jù)加上排他鎖后,其他事務不能再在其上加其他的鎖。

mysql InnoDB引擎默認的修改數(shù)據(jù)語句,update,delete,insert 都會自動給涉及到的數(shù)據(jù)加上排他鎖,select 語句默認不會加任何鎖類型。

如果加排他鎖可以使用select ...for update 語句,加共享鎖可以使用select ... lock in share mode語句。所以加過排他鎖的數(shù)據(jù)行在其他事務種是不能修改數(shù)據(jù)的,也不能通過for update和lock in share mode鎖的方式查詢數(shù)據(jù),但可以直接通過select ...from...查詢數(shù)據(jù),因為普通查詢沒有任何鎖機制。

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

for update 排他鎖

有如下測試數(shù)據(jù):

file

現(xiàn)在我們對id=1的數(shù)據(jù)行排他查詢,這里會使用BEGIN開啟事務,而不會COMMIT提交事務,這樣做是用來測試,因為提交事務或回滾事務就會釋放鎖。

file

會查詢到一條數(shù)據(jù),現(xiàn)在打開另一個查詢窗口,對同一數(shù)據(jù)分別使用排他查和共享鎖查詢兩種方式查詢:

排他查:

file

共享查:

file

我們看到開了排他鎖查詢和共享鎖查詢都會處于阻塞狀態(tài),因為id=1的數(shù)據(jù)已經(jīng)被加上了排他鎖,此處阻塞是等待排他鎖釋放。

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

file

我們看到是可以查詢到數(shù)據(jù)的。

LOCK IN SHARE MODE 共享鎖

我們再看一下一個事務獲取了共享鎖,在其他查詢中也加共享鎖或不加鎖的情況。

共享鎖的事務查詢,沒有關閉事務

file

無鎖查詢:

file

共享查:

file

排他鎖,接著使用排他鎖來查詢:

file

我們看到是不加鎖的查詢和共享查可以查詢數(shù)據(jù)的,但加排他鎖就查不到,因為排他鎖與共享鎖不能存在同一數(shù)據(jù)上。

InnoDb 鎖機制

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

file

無鎖查詢

file

共享鎖查詢

file

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

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

file
file

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

?文源網(wǎng)絡,僅供學習之用,如有侵權,聯(lián)系刪除。

我將優(yōu)質(zhì)的技術文章和經(jīng)驗總結都匯集在了我的公眾號【Java圈子】里,為方便大家學習,還整理了一套學習資料,免費提供給熱愛Java的同學! 更有學習交流群,多交流問題才能更快進步~

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容