mysql鎖機制分爲表級鎖和行級鎖,本文就和你們分享一下我對mysql中行級鎖中的共享鎖與排他鎖進行分享交流。mysql
共享鎖又稱爲讀鎖,簡稱S鎖,顧名思義,共享鎖就是多個事務對於同一數據能夠共享一把鎖,都能訪問到數據,可是隻能讀不能修改。sql
排他鎖又稱爲寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其餘所並存,如一個事務獲取了一個數據行的排他鎖,其餘事務就不能再獲取該行的其餘鎖,包括共享鎖和排他鎖,可是獲取排他鎖的事務是能夠對數據就行讀取和修改。測試
對於共享鎖你們可能很好理解,就是多個事務只能讀數據不能改數據,對於排他鎖你們的理解可能就有些差異,我當初就犯了一個錯誤,覺得排他鎖鎖住一行數據後,其餘事務就不能讀取和修改該行數據,其實不是這樣的。排他鎖指的是一個事務在一行數據加上排他鎖後,其餘事務不能再在其上加其餘的鎖。mysql InnoDB引擎默認的修改數據語句,update,delete,insert都會自動給涉及到的數據加上排他鎖,select語句默認不會加任何鎖類型,若是加排他鎖可使用select ...for update語句,加共享鎖可使用select ... lock in share mode語句。因此加過排他鎖的數據行在其餘事務種是不能修改數據的,也不能經過for update和lock in share mode鎖的方式查詢數據,但能夠直接經過select ...from...查詢數據,由於普通查詢沒有任何鎖機制。3d
說了這麼多,我們來看下如下簡單的例子:blog
咱們有以下測試數據事務
如今咱們對id=1的數據行排他查詢,這裏會使用begin開啓事務,而不會看見我關閉事務,這樣作是用來測試,由於提交事務或回滾事務就會釋放鎖。bfc
打開一個查詢窗口date
會查詢到一條數據,如今打開另外一個查詢窗口,對同一數據分別使用排他查和共享鎖查詢兩種方式查詢select
排他查im
共享查
咱們看到開了排他鎖查詢和共享鎖查詢都會處於阻塞狀態,由於id=1的數據已經被加上了排他鎖,此處阻塞是等待排他鎖釋放。
若是咱們直接使用如下查詢呢
咱們看到是能夠查詢到數據的。
咱們再看一下一個事務獲取了共享鎖,在其餘查詢中也只能加共享鎖或不加鎖。
咱們看到是能夠查詢數據的,但加排他鎖就查不到,由於排他鎖與共享鎖不能存在同一數據上。
最後咱們驗證下上面說的mysql InnoDb引擎中update,delete,insert語句自動加排他鎖的問題,
此時共享查詢處於阻塞,等待排它鎖的釋放,可是用普通查詢能查到數據,由於沒用上鎖機制不與排他鎖互斥,但查到的數據是修改數據以前的老數據。
而後咱們提交數據,釋放排他鎖看下修改後的數據,此時可用排他查,共享查和普通查詢, 由於事務提交後該行數據釋放排他鎖,下面就只顯示普通查詢,其餘的同窗們本身去驗證。
能夠看到結果與預期的同樣。
以上爲我對mysql中共享鎖與排他鎖的我的理解,有不正確的地方還但願各位指正。