mysql 隔离级别和锁相关
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 隔离级别和锁相关的主要内容,如果未能解决你的问题,请参考以下文章