天天看點

【MySQL】innodb行鎖變表鎖

關于下文中的表格看法,按照時間軸排列的

【MySQL】innodb行鎖變表鎖

InnoDB 行級鎖是通過給索引上的索引項加鎖來實作的,InnoDB行級鎖隻有通過索引條件檢索資料,才使用行級鎖;否則,InnoDB使用表鎖

在不通過索引(主鍵)條件查詢的時候,InnoDB是表鎖而不是行鎖。

建立表

建立一個沒有主鍵的表

CREATE TABLE `test_no_key` (
`f1`  int(11) NOT NULL ,
`f2`  varchar(11)  DEFAULT NULL 
)
ENGINE=InnoDB
      

插入倆條資料

insert into from test_no_key (f1,f2) values (1,2);

insert into test_no_key (f1,f2) values (2,2);
      

開啟倆個程序

【MySQL】innodb行鎖變表鎖

案例1

就是在沒有使用索引的情況下InnoDB就會使用表級鎖(共享鎖不會有這個情況)

程序1 程序2
begin
【MySQL】innodb行鎖變表鎖
【MySQL】innodb行鎖變表鎖
【MySQL】innodb行鎖變表鎖
會出現等待
【MySQL】innodb行鎖變表鎖
程序1執行送出
【MySQL】innodb行鎖變表鎖
【MySQL】innodb行鎖變表鎖

案例2

給表加上主鍵

【MySQL】innodb行鎖變表鎖

這個測試可以看到,當有主鍵時,是行鎖,隻會對一條資料進行加鎖

【MySQL】innodb行鎖變表鎖
【MySQL】innodb行鎖變表鎖
【MySQL】innodb行鎖變表鎖

案例3

如果查詢的條件沒有帶索引,那麼行鎖則會轉為表鎖即時表中字段有主鍵;是以在查詢的時候建議使用索引字段查詢

檢視表資料

【MySQL】innodb行鎖變表鎖
【MySQL】innodb行鎖變表鎖
【MySQL】innodb行鎖變表鎖
【MySQL】innodb行鎖變表鎖