3.行级锁

行级锁介绍

InnoDB存储引擎实现

一. InnoDB的行级锁,按照锁定范围来说,分为三种:

1.记录锁(Record Locks):锁定索引中一条记录。 主键指定 where id=3

2.间隙锁(Gap Locks): 锁定记录前、记录中、记录后的行 RR隔离级 (可重复读)-- MySQL默认隔离级

当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(NEXT-KEY)锁。

3.Next-Key 锁: 记录锁 + 间隙锁


二.InnoDB的行级锁,按照功能来说,分为两种:(以下案例都是在同一个事务中)

1.共享读锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁共享读不能。
select * from mylock where id=1 LOCK IN SHARE MODE;

加完锁以后在事务未提交时候同session可以修改操作,和读操作,不同session不可以修改操作但可以读操作。

在同一个事务   中如果在没有索引的字段上添加读锁会导致锁升级到表锁,会把整张表锁住。

2.排他写锁(X):允许获得排他写锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁(不是读)和排他写锁。

手动添加:SELECT * FROM table_name WHERE ... FOR UPDATE;

写锁是自动添加的,在同一个session中未提交的时候可以读取和修改 ,不同session可以读操作因为读不加锁,不可以写操作。

3.InnoDB也实现了表级锁,也就是意向锁,意向锁是mysql内部使用的,不需要用户干预。

意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。

意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

意向锁的主要作用是为了【全表更新数据】时的性能提升。否则在全表更新数据时,需要先检索该表是否某些记录上面有行锁。


三.间隙锁

间隙锁防止两种情况

1、防止插入间隙内的数据

2、防止已有数据更新为间隙内的数据

下面是案例数据:


间隙的范围:

update news set number=3 where number=4;

number:234

id:12345

产生间隙锁情况,不同session在事务中操作:

1.非唯一索引等值(只要number(where后面的)在间隙里(2 3 4),不包含最后一个数(5)则不管id是多少都会阻塞)

update news set number=3 where number=4;

2.主键索引范围(只要id(在where后面的)在间隙里(2 4 5),则不管number是多少都会阻塞)

 update news set number=3 where id>1 and id <6;

3.非唯一索引无穷大(id和number同时满足注:非主键索引产生间隙锁,主键范围产生间隙锁)

update news set number=3 where number=13 ;

你可能感兴趣的:(3.行级锁)