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,606评论 0 22
  • InnoDB的行锁按锁的互斥程度来划分 Shared Lock 共享锁(s):又称读锁。 允许一个事务去读一行,阻...
    尹楷楷阅读 622评论 0 1
  • 来自公众号JavaKeeper作者:派大新 ❝写在之前:不建议那种上来就是各种面试题罗列,然后背书式的去记忆,对技...
    夜空_2cd3阅读 15,455评论 5 139
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,587评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,220评论 4 8