说下 InnoDB 存储引擎中的锁?

516 阅读3分钟

这是我参与8月更文挑战的第 15 天,活动详情查看:8月更文挑战

作者简介:悟空,8年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:悟空聊架构。本文已收录至 www.passjava.cn

大家好,我是悟空哥,今天给大家带来的是大厂面试题:

说下 InnoDB 存储引擎中的锁?

行级锁

共享锁(S Lock),允许事务读一行数据。

排他锁(X Lock),允许事务删除或更新一行数据。

表级锁

意向共享锁(IS Lock),事务想要获得一张表中某几行的共享锁。

意向排他锁(IX Lock),事务想要获得一张表中某几行的排他锁。

补充

1、若将上锁的对象看成一颗树,那么对最下层的对象上锁,就是对最细粒度的对象进行上锁,首先就需要对粗粒度的对象上锁,

比如需要给某记录上 X 锁,那么就需要先对数据库 A、表、页 上意向锁 IX,最后对对记录上 X 锁。 2、默认读操作不加锁,走 MVCC 多版本控制机制。

为什么要有意向锁?

如果加了行锁,肯定之前就会给加上意向锁,有其他事务想要锁住表,先看有没有表级意向锁,这样就不用到记录上看有没有 S 或 X 锁,优点就是快,省了很多步骤。

举个生活中的例子:

图书馆有很多层,每一层有很多房间,二楼的 201 房间正在装修,不能进入,相当于给 201 房间加了排他锁,然后在二楼门口立了一个警示牌:二楼有人正在装修(相当于加了一个意向排他锁)。 到图书馆关门的点了,管理员开始检查各楼栋是否还有人,发现二楼有个警示牌,呀,还有人在装修啊,暂时就不能关门了。这里把 201 房间当做某行记录,二楼当做表。装修比作事务 1,管理员要关闭图书馆比作事务 2。

文绉绉解释:

IS、IX锁是表级锁,它们的提出仅仅为了在之后加表级别的S锁和X锁时可以快速判断表中的记录是否被上锁,以避免用遍历的方式来查看表中有没有上锁的记录。就是说当对一个行加锁之后,如果有打算给行所在的表加一个表锁,必须先看看该表的行有没有被加锁,否则就会出现冲突。IS锁和IX锁就避免了判断表中行有没有加锁时对每一行的遍历。直接查看表有没有意向锁就可以知道表中有没有行锁。