【MySQL(八)】一致性非鎖定讀 鎖定讀

mysql的鎖有若干種分類標準,這裏看下行鎖中的讀鎖與寫鎖。

讀鎖即S鎖,也叫共享鎖,當事務讀取一行數據時,會嘗試在記錄上加S鎖;

寫鎖即X鎖,也叫排它鎖,當事務要更新或者刪除一行數據時,會嘗試在記錄上加X鎖;

只有S鎖和S鎖是互相兼容的,其餘情況都是不兼容的,需要等待。

默認情況下,所得兼容性如上面的表格所示。

下面我們專門看下讀取操作是如何上鎖的,或者說是否完全如上表所示。

在serializable級別下,會完全按照如上規則運行。在其他級別下,讀取可以發生在上了X鎖的數據上,除非讀取使用了for update語法。關於serializable隔離級別,參見https://blog.csdn.net/u010900754/article/details/78108735

舉個例子:

T1:

T1先更新一條數據,上了X鎖;

T2:

T2讀取數據時發生了鎖等待;

結論:在serializable隔離級別下,S鎖和X鎖按照鎖兼容性執行;這樣的讀取叫做鎖定讀,鎖定讀的含義是事務讀取有X鎖的數據時,必須等待。除了在serializable級別下會有鎖定讀,在其他級別下,使用select for update查詢時也可以鎖定讀,也可以理解爲讀取時必須先上X鎖;

for update例子:

T1:

T1先更新一條數據,上了X鎖;

T2:

T2讀取數據,如果不寫for update,那麼由於是在repeatable read隔離級別下,使用的是非鎖定讀,是可以讀的(見下面的例子);但是由於加了for update,就需要先上X鎖,那麼會鎖等待。

但是在其他隔離級別下呢?

如果一個事務在一行記錄上加了X鎖,其餘事務仍然可以在這一行數據上加S鎖,進行讀取,讀到什麼內容取決於隔離級別設置,這個不在本篇展開。爲什麼要這麼做?因爲如果完全按照鎖兼容性來執行,那麼大量事務併發時,會有很多鎖等待,降低了事務的併發性。事實上,innodb引擎使用了一種叫做MVCC的機制,來實現上述機制。也就是即使別的事務在該行數據上加了X鎖,當前事務仍然能夠讀取數據,MVCC機制用於保證該隔離級別下的數據一致性。

例子:

T1:

T1先更新一條數據,上了X鎖;

T2:

T2仍然可以讀取到數據。

結論:非鎖定讀可以讓事務讀取到已經上了X鎖的數據,原理是MVCC機制。

總結:

1.明白鎖定讀與非鎖定讀的概念;

2.鎖定讀與非鎖定讀的區別在於事務如果讀取已經被上了X鎖的數據;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章