意向锁

编程

在前面的文章数据库死锁中有提到数据库意向锁,但非常抱歉,之前的分析是错误的。

MySQL中意向锁是用来解决什么问题的呢?或者说,意向锁又适用于哪些场景?

首先,我们需要了解什么是意向锁,截取自官方文档:

A kind of lock that applies to the table, used to indicate the kind of lock the transaction intends to acquire on rows in the table.

再结合官方文档中 Intention Locks 的介绍,我们获得一个重要的信息:意向锁是一个表级锁。

而文章数据库死锁中,分析错误的原因就在于:IXIS是表级锁,不会和行级的XS锁发生冲突。

其次,意向锁具体是去解决什么问题的?MySQL总不会无缘无故在X锁的基础上再来一个IX锁。

MySQLINNODB存在两种锁类型:行锁和表锁。当某个事务需要对整个数据表加锁时,数据库内部应该怎么处理呢?

因为可能存在行锁,所以,我们需要扫描整个数据表,确认不存任何行锁时,才能对整个数据表进行操作。但这个过程,是非常低效的。而意向锁就是为了解决这个问题出现的。

我们在获取X锁时,首先会获取IX锁,来说明数据表中将要进行事务操作。反过来想,这也是IX锁和IX锁可以相互兼容的原因。

最后,再来回顾数据库死锁中的例子,对语句做了调整:

# name是唯一索引,id为主键

update friends set id = 2 where name = "道道法"

分析update语句的执行流程,忽略掉了过程中内存和日志的操作:

  1. 引擎通过索引查找到这条记录
  2. 引擎获取到记录信息,对其进行修改。之后,调用内部写接口,更新数据
  3. 引擎提交事务

问题:事务执行过程中,对记录的主键进行了更新(但可以确定,新生成的主键一定不会和现有主键发生冲突)。

我理解,事务不仅需要对道道法这一行数据加锁,还需要新增的id进行加锁,也就是间隙锁。具体怎么就发生DeadLock了,还需要再考虑。

以上是 意向锁 的全部内容, 来源链接: utcz.com/z/514509.html

回到顶部