MySQL的InnoDB鎖機制

2021-06-25 19:32:26 字數 971 閱讀 1227

在innodb的事務隔離級別是可重複讀級別且innodb_locks_unsafe_for_binlog禁用的前提下,mysql的鎖機制經過測試為

1.當update和delete操作的時候,mysql的加鎖機制大概為三步

(1)對where條件後面的條件進行鎖索引區域操作,如果沒有壓上索引,則整個索引進行鎖索引,類似於鎖表,但本質上依然是鎖行。

(2)鎖定指定的主鍵範圍,如果存在主鍵。若不指定主鍵範圍,且主鍵存在,則鎖定整個主鍵索引。

(3)如鎖定主鍵為乙個範圍,則觸發next-key-lock機制,會對索引範圍的頭部的下乙個記錄進行行鎖處理

注意:等於的條件會產生單條鎖,其他的條件會產生範圍鎖

如果表為空表,會鎖定全部索引 類似於表鎖

2.當產生了步驟1的鎖以後,如果鎖所在的事務沒有提交,而乙個新事務做新操作如插入 刪除 更新的時候,如果操作記錄的主鍵或者索引在鎖定的範圍內,則會產生鎖等待。

3.多執行緒的情況下的死鎖:

(1)執行緒1:執行了更新了操作,獲取到了非主鍵索引的鎖,請求主鍵索引的鎖

(2)執行緒2:執行了插入操作,獲取了主鍵索引的鎖,請求非主鍵索引的鎖

(3)執行緒1和執行緒2併發執行,這時候互相等資源造成死鎖

4.比較特殊的死鎖情況為:

當乙個空表(test_tb)中,沒有任何的資料的前提下,做如下操作

(1)事務1:更新或者刪除這個表

(2)事務2:更新或者刪除這個表

(3)事務1:插入某個記錄 (會block住)

(4)事務2:插入某個記錄 (報死鎖)

當兩個事務拿到相同區間鎖後,就會阻止對方忘區間內做insert操作。所以第乙個事務insert會阻塞,第二個事務會提示死鎖

MySQL之InnoDB鎖機制

innodb儲存引擎實現了如下兩種標準的行級鎖 共享鎖 s lock 允許事務讀一行資料。排他鎖 x lock 允許事務刪除或更新一行資料。如果乙個事務 t1 已經獲得了行 r 的共享鎖,那麼另外的事務 t2 可以立即獲得行 r 的共享鎖,因為讀取並沒有改變行 r 的資料,稱這種情況為鎖相容。但若有...

InnoDB之鎖機制

前兩天聽了姜老大關於innodb中鎖的相關培訓,剛好也在看這方面的知識,就順便利用時間把這部分知識做個整理,方便自己理解。主要分為下面幾個部分 1.innodb同步機制 innodb儲存引擎有兩種同步機制選擇,一種是mutex,其是完全的互斥方法。另一種是rw lock,可以給臨界資源加上s lat...

四 InnoDB鎖機制

四 innodb鎖機制 1 表鎖 意向共享鎖 intention shared lock,is 表級意向共享鎖,即表示事務有意向對錶中的某些行加共享s鎖。如select lock in share mode語句,在加行鎖之前會在表上現加is鎖,這樣可以提高鎖衝突檢測的效率,同時也可以避免事務在表級新...