mysql InnoDB引擎與鎖機制

2021-10-07 19:54:28 字數 3033 閱讀 7004

共享鎖(s鎖):指讀鎖

排它鎖(x鎖):寫鎖,更新或刪除鎖

共享鎖與共享鎖相容與排它鎖互斥,排它鎖與排它鎖/共享鎖都互斥

事務a對記錄加共享鎖,事務b對相同資料可以加共享鎖,但是不能加排它鎖

事務a對記錄加排它鎖,事務b對相同資料既不能加共享鎖也不能加排它鎖.

select 時也可以顯示加共享鎖:在語句最後加lock in share mode;

select 時也可以顯示加排他鎖:在語句最後加for update;

lock tables 表名 read  鎖表(讀)  

lock tables 表名 write 鎖表(寫)

unlock tables 解鎖

select * from 表名 where xx lock in share mode 鎖行(select)

select * from 表名 where xx for update 鎖行(update delete)

意向共享鎖(is):表共享鎖  

意向排它鎖(ix):表排他鎖

意向鎖是表級鎖,意向鎖與意向鎖之間不衝突,與行級的共享鎖/排它鎖也不衝突,但是意向排它鎖與表級排它鎖/表級共享鎖衝突,意向共享鎖與表級排他鎖衝突.

意向鎖的作用:當乙個事務a獲取表中的一條或者幾條記錄的排他鎖時,如果其他事務要獲取表級鎖,需要先遍歷所有行,看是否有其他事務的行級鎖,來確定是否可以加表級鎖,這樣做效率太慢了.當乙個事務要獲取排它鎖/共享鎖之前,就必須獲取意向排它鎖/意向共享鎖,只要根據表上是否有意向排他鎖/意向共享鎖,其他事務就可以直接判斷是夠否能夠加表級排他鎖/表級意向鎖,從而節約時間.

間隙鎖與間隙鎖不互斥,是防止insert,行鎖防止併發update跟delete

間隙鎖只作用在repeatable read事務隔離級別下

對於唯一索引確定唯一記錄情況下不適用gap鎖,其他情況都是用gap鎖(主鍵唯一,並且確定唯一記錄情況下,本身就是不能在當前主鍵插入資料,所以也不需要gap鎖),當使用非唯一索引時候,也會鎖定範圍為索引值,不允許插入相同索引值.

如果沒有通過索引檢索時,會鎖定所有間隙,既其他事務什麼也插入不了.

gap範圍,在next-key鎖中詳細展示範圍.

next-key鎖:行鎖+gap鎖,repeatable read 事務隔離級別下才有

如果有資料:id

name

10li

20zhang

30zhao

如果沒有使用索引:

select * from test where *** ;  無論什麼條件都是表鎖
如果使用唯一索引並且確定記錄next-key鎖下降為行級鎖:

select * from test  where id

= 10 for update; id為唯一索引/主鍵,鎖定10行,並且主鍵唯一,不能再插入id=10的資料

使用普通索引並且確定唯一記錄:

select * from test  where id

= 10 for update; id為普通索引

鎖定範圍 (+∞,20)

同理id

= 20 [10,30)

id= 30 [20,+∞)

使用普通索引鎖定區間無記錄:

select * from test where id

= 11 for update;

(表中沒有id=11的記錄)

鎖定範圍為[10,20)

同理id

= 9 則(-∞,10)

id= 21 則[20,30)

id= 31 則[30,+∞)

唯一索引(主鍵)鎖定區間無記錄:gap鎖

id

= 9 則(-∞,10)

id= 15 則(10,20)

id= 21 則(20,30)

id= 31 則(30,+∞)

插入意向鎖本質也是gap鎖,但是插入意向鎖與真正的gap鎖是互斥的,查閱了一下,包括官網說的都是模稜兩可的,本人理解是:鎖跟鎖是要互斥才能保證併發的順序,插入記錄時候,因為此時判斷是否能夠插入的是gap鎖,但是如果insert不獲取鎖的話,就沒有辦法使插入操作進行執行緒等待,而插入的記錄獲取的是gap鎖的話,起不到作用,因為gap鎖不互斥,而gap鎖與排它鎖又完全不是乙個層次的鎖,gap鎖作用於inset,排它鎖作用於update跟delete,所以才設計乙個意向插入鎖,當事務獲取了gap鎖時,另外乙個事務必須要獲取插入意向鎖,此時兩個鎖互斥,這樣才能保證insert可以插入還是執行緒等待.

這個鎖作用於rr事務隔離級別下的有自增主鍵的表的插入.是表級鎖.

test表有id自增主鍵,name字串列,

insert into test(name) values(『li』) (還有其他insert into語句)此時插入語句會去獲取表級的auto_inc鎖,其他插入的事務需要等待.

此鎖主要是為了保證主鍵的自增,對資料鎖定是針對的語句級,而不是事務級.分不同模式,通過innodb_autoinc_lock_mode引數指定,詳細內容就不介紹了.

read uncommitted 讀不加鎖 寫加表或者行鎖

read committed 讀不加鎖,使用mvcc,寫加表鎖或者行鎖

repeatable read 讀不加鎖,使用mvcc,寫加next-key鎖

serializable 讀加讀鎖,寫加寫鎖,都是表級(不要用for update,for update會更改預設的表鎖,所以測試會發現不一樣)

Mysql innodb引擎(二)鎖

專案 isixsx is相容 相容相容 不相容ix 相容相容 不相容不相容s相容 不相容相容 不相容x 不相容不相容 不相容不相容 是指 innodb 通過多版本控制的方式來讀取當前執行時間資料庫中的資料。如果,讀取的時候行正好在執行 delete 或 update 的排他操作,那讀取操作不會等待,...

MYSQL InnoDB儲存引擎 鎖

目錄 鎖的型別 行級鎖 意向鎖 一種表級鎖 一致性非鎖定讀 innodb儲存引擎的預設設定 行鎖的3種演算法 死鎖 innodb儲存引擎實現了如下兩種標準的行級鎖 1 共享鎖 s lock 允許事務讀一行資料。select column from table lock in share mode 2...

MySQL Innodb引擎鎖總結

1.鎖的目的是什麼?innodb中利用mvcc 多版本併發控制 可以在不加鎖的情況下提高併發訪問下系統的吞吐量。但有些場景下併發訪問必須要在鎖的保護下進行,比如併發的更新。2.鎖的分類 一般鎖是指lock。innodb中還有不常用的一種輕量級鎖latch,latch中不存在死鎖檢測機制,適合加鎖時間...