mysql 隔离级别和锁相关
mysql數(shù)據(jù)庫中存在三種鎖,間隙鎖(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的鎖的表現(xiàn)形式
delete from tt where tid = 1 ?
update tt set taddr = "BeiJing" where tid = 1
1.tid為主鍵?
(1).1存在于表中就對記錄添加record-lock
(2).1不存在于表中g(shù)ap-lock,行記錄的間隙鎖
2.tid為普通字段(沒有索引)就對所有記錄添加,record-lock,grap-lock
?
3.tid為非聚集唯一索引
(1).1存在于表中就對記錄添加record-lock,會鎖定索引值和行數(shù)據(jù)
(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的鎖的表現(xiàn)形式
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,會鎖定索引值和行數(shù)據(jù)
(2).1不存在于表中不鎖定數(shù)據(jù)
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隔離級別下 test1中沒有數(shù)據(jù)的情況下test ,test1 不添加鎖
在rc隔離級別下 test1中有數(shù)據(jù)的情況下test ,不添加鎖 ,test1 加S表所
select * ?into outfile ?from ?test ? 不鎖定test表(rr,rc都有驗證)
轉(zhuǎn)載于:https://blog.51cto.com/dwchaoyue/1879590
總結(jié)
以上是生活随笔為你收集整理的mysql 隔离级别和锁相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QRCode.js -- 用 Javas
- 下一篇: 5、kafka的操作