一分钟深入Mysql的意向锁——《深究Mysql锁》
延伸閱讀:
三分鐘了解Mysql的表級鎖
五分鐘了解Mysql的行級鎖
mysql鎖相關講解及其應用——《深究mysql鎖》了解鎖前,一定要先看這篇,了解什么是MVCC,如果我們學習鎖,沒有MVCC的知識,理解起來會總覺得不明朗。本來我的這個只是個記錄,并不是專門的講給別人看的,后發現有不少人看,我還是專門加上這篇文章的鏈接。
在《五分鐘了解Mysql的行級鎖》中說到,InnoDB為了讓表鎖和行鎖共存而使用了意向鎖。但是并沒有細說為什么如果沒有意 向鎖的話,表鎖和行鎖不能共存。 現在就來細說一下。
為什么沒有意向鎖的話,表鎖和行鎖不能共存?
舉個粟子(此時假設行鎖和表鎖能共存): 事務A鎖住表中的一行(寫鎖)。事務B鎖住整個表(寫鎖)。
但你就會發現一個很明顯的問題,事務A既然鎖住了某一行,其他事務就不可能修改這一行。這與”事務B鎖住整個表就能修改表中的任意一行“形成了沖突。所以,沒有意向鎖的時候,行鎖與表鎖共存就會存在問題!
意向鎖是如何讓表鎖和行鎖共存的?
有了意向鎖之后,前面例子中的事務A在申請行鎖(寫鎖)之前,數據庫會自動先給事務A申請表的意向排他鎖。當事務B去申請表的寫鎖時就會失敗,因為表上有意向排他鎖之后事務B申請表的寫鎖時會被阻塞。
所以,意向鎖的作用就是:
當一個事務在需要獲取資源的鎖定時,如果該資源已經被排他鎖占用,則數據庫會自動給該事務申請一個該表的意向鎖。如果自己需要一個共享鎖定,就申請一個意向共享鎖。如果需要的是某行(或者某些行)的排他鎖定,則申請一個意向排他鎖。
?說明:意向鎖之間都是兼容的,之前是我看錯了,Im so sorry參考:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-intention-locks
意向鎖是表鎖還是行鎖?
首先可以肯定的是,意向鎖是表級別鎖。意向鎖是表鎖是有原因的。
當我們需要給一個加表鎖的時候,我們需要根據意向鎖去判斷表中有沒有數據行被鎖定,以確定是否能加成功。如果意向鎖是行鎖,那么我們就得遍歷表中所有數據行來判斷。如果意向鎖是表鎖,則我們直接判斷一次就知道表中是否有數據行被鎖定了。
總結
以上是生活随笔為你收集整理的一分钟深入Mysql的意向锁——《深究Mysql锁》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五分钟了解Mysql的行级锁——《深究M
- 下一篇: 一分钟理清Mysql的锁类型——《深究M