天天看點

mysql鎖機制(六)

快照讀:

簡單的select操作,沒有lock in share mode或for update,快照讀不會加任何的鎖,而且由于mysql的一緻性非鎖定讀的機制存在,任何快照讀也不會被阻塞。但是如果事務的隔離級别是SERIALIZABLE的話,那麼快照讀也會被加上共享的next-key鎖,本文不對SERIALIZABLE隔離級别做叙述。

目前讀:

官方文檔的術語叫locking read,也就是insert,update,delete,select..in share mode和select..for update,目前讀會在所有掃描到的索引記錄上加鎖,不管它後面的where條件到底有沒有命中對應的行記錄。目前讀可能會引起死鎖。

意向鎖:

innodb的意向鎖主要使用者多粒度的鎖并存的情況。比如事務A要在一個表上加S鎖,如果表中的一行已被事務B加了X鎖,那麼該鎖的申請也應被阻塞。如果表中的資料很多,逐行檢查鎖标志的開銷将很大,系統的性能将會受到影響。為了解決這個問題,可以在表級上引入新的鎖類型來表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。舉個例子,如果表中記錄1億,事務A把其中有幾條記錄上了行鎖了,這時事務B需要給這個表加表級鎖,如果沒有意向鎖的話,那就要去表中查找這一億條記錄是否上鎖了。如果存在意向鎖,那麼假如事務A在更新一條記錄之前,先加意向鎖,再加X鎖,事務B先檢查該表上是否存在意向鎖,存在的意向鎖是否與自己準備加的鎖沖突,如果有沖突,則等待直到事務A釋放,而無須逐條記錄去檢測。事務B更新表時,其實無須知道到底哪一行被鎖了,它隻要知道反正有一行被鎖了就行了。

說白了意向鎖的主要作用是處理行鎖和表鎖之間的沖突,能夠顯示“某個事務正在某一行上持有了鎖,或者準備去持有鎖”

不可重複讀:

指的是在同一個事務中,連續幾次快照讀,讀取的記錄應該是一樣的

不可重複讀的示範較為簡單,本文不做讨論。

繼續閱讀