首页 > 代码库 > mysql 隔离级别和锁相关

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 隔离级别和锁相关