標籤:mysql 鎖 隔離等級
mysql資料庫中存在三種鎖,間隙鎖(gap-lock) , 行鎖(record-lock),gap-record-lock
gap-record-lock 是間隙鎖和行鎖的組合,
間隙鎖(gap lock)
行鎖(record lock)
record-lock:
測試表:
CREATE TABLE `tt` (
`tid` int(11) NOT NULL DEFAULT ‘0‘,
`tname` varchar(10) DEFAULT NULL,
`tage` tinyint(4) DEFAULT NULL,
`taddr` varchar(100) DEFAULT NULL,
`tmark` varchar(1000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
無論在什麼隔離等級下,以下操作都是要擷取表的metadata鎖的
truncate,DDL(alter,drop,create),添加索引 會對錶添加metadata鎖,也就是會鎖定整張表
在隔離等級是rr的情況下,delete,update,insert的鎖的表現形式
delete from tt where tid = 1
update tt set taddr = "BeiJing" where tid = 1
1.tid為主鍵
(1).1存在於表中就對記錄添加record-lock
(2).1不存在於表中gap-lock,行記錄的間隙鎖
2.tid為普通欄位(沒有索引)就對所有記錄添加,record-lock,grap-lock
3.tid為非聚集唯一索引
(1).1存在於表中就對記錄添加record-lock,會鎖定索引值和行資料
(2).1不存在於表中就添加gap-lock,會鎖定索引的某一個範圍值
4.tid為非聚集非唯一索引
(1).1存在於表中就添加record-lock,gap-lock,會對行記錄,索引記錄添加record-lock,會鎖定索引的某一個範圍
(2).1不存在於表中,會鎖定索引的某個範圍
insert
添加意向插入鎖,檢查某個範圍是否被鎖定
間隙鎖只會影響插入,不會影響update和delete
1.只有主鍵對記錄添加X鎖
2.有唯一鍵,會對唯一索引值添加S鎖
3.有主鍵和唯一鍵,對主索引值添加x,對唯一索引值添加s
insert into test1 select * from test
在rr情況下test 添加的是s鎖,test1 添加的X
在隔離等級是rc的情況下,delete,update,insert的鎖的表現形式
delete from tt where tid = 1
update tt set taddr = "BeiJing" where tid = 1
1.tid為主鍵
(1).1存在於表中就對記錄添加record-lock
(2).1不存在於表中,不添加鎖
2.tid為普通欄位(沒有索引)就對所有記錄添加鎖
3.tid為非聚集唯一索引
(1).1存在於表中就對記錄添加record-lock,會鎖定索引值和行資料
(2).1不存在於表中不鎖定資料
4.tid為非聚集非唯一索引
(1).1存在於表中就添加record-lock,會對行記錄,索引記錄添加record-lock
(2).1不存在於表中不添加鎖
insert
1.只有主鍵對記錄添加X鎖
2.有唯一鍵,會對唯一索引值添加S鎖
3.有主鍵和唯一鍵,對主索引值添加x,對唯一索引值添加s
insert into test1 select * from test
在rc情況下test 不添加鎖,test1添加x鎖
select * into outfile from test 不鎖定test表(rr,rc都有驗證)
本文出自 “SQLServer MySQL” 部落格,請務必保留此出處http://dwchaoyue.blog.51cto.com/2826417/1879590
mysql 隔離等級和鎖相關