意向锁
在前面的文章数据库死锁中有提到数据库意向锁,但非常抱歉,之前的分析是错误的。
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 的介绍,我们获得一个重要的信息:意向锁是一个表级锁。
而文章数据库死锁中,分析错误的原因就在于:IX
、IS
是表级锁,不会和行级的X
、S
锁发生冲突。
其次,意向锁具体是去解决什么问题的?MySQL
总不会无缘无故在X
锁的基础上再来一个IX
锁。
MySQL
中INNODB
存在两种锁类型:行锁和表锁。当某个事务需要对整个数据表加锁时,数据库内部应该怎么处理呢?
因为可能存在行锁,所以,我们需要扫描整个数据表,确认不存任何行锁时,才能对整个数据表进行操作。但这个过程,是非常低效的。而意向锁就是为了解决这个问题出现的。
我们在获取X
锁时,首先会获取IX
锁,来说明数据表中将要进行事务操作。反过来想,这也是IX
锁和IX
锁可以相互兼容的原因。
最后,再来回顾数据库死锁中的例子,对语句做了调整:
# name是唯一索引,id为主键update friends set id = 2 where name = "道道法"
分析update
语句的执行流程,忽略掉了过程中内存和日志的操作:
- 引擎通过索引查找到这条记录
- 引擎获取到记录信息,对其进行修改。之后,调用内部写接口,更新数据
- 引擎提交事务
问题:事务执行过程中,对记录的主键进行了更新(但可以确定,新生成的主键一定不会和现有主键发生冲突)。
我理解,事务不仅需要对道道法
这一行数据加锁,还需要新增的id
进行加锁,也就是间隙锁。具体怎么就发生DeadLock
了,还需要再考虑。
以上是 意向锁 的全部内容, 来源链接: utcz.com/z/514509.html