mysql悲觀鎖中的共用鎖定和獨佔鎖定

來源:互聯網
上載者:User

標籤:.com   gray   space   sha   init   ack   add   height   ini   

概述:

共用鎖定又稱為讀鎖,簡稱S鎖,顧名思義,共用鎖定就是多個事務對於同一資料可以共用一把鎖,都能訪問到資料,但是只能讀不能修改。

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

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

總結:

1獨佔鎖定和其他鎖不能共存

2innoDB引擎.預設對update,delete,insert加獨佔鎖定,select語句預設不加鎖

3共用鎖定可以和其他鎖共存

測試:

我們有如下測試資料

 

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

開啟一個查詢時段

 

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

排他查

共用查

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

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

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

我們再看一下一個事務擷取了共用鎖定,在其他查詢中也只能加共用鎖定或不加鎖。

我們看到是可以查詢資料的,但加獨佔鎖定就查不到,因為獨佔鎖定與共用鎖定不能存在同一資料上。

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

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

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

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


mysql悲觀鎖中的共用鎖定和獨佔鎖定

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.