根据here的官方文件:
锁兼容性矩阵:
X IX S IS
X Conflict Conflict Conflict Conflict
IX Conflict Compatible Conflict Compatible
S Conflict Conflict Compatible Compatible
IS Conflict Compatible Compatible Compatible
文档也说:
因此,意图锁不会阻止除完整表请求之外的任何内容 (例如,LOCK TABLES ... WRITE)。 IX和IS的主要目的 锁是为了表明某人正在锁定一行,或者要锁定一行 在表中。
如果意图锁定只阻止全表请求,那么如何用上面的锁兼容性矩阵解释与S锁的IX冲突?根据我的理解,锁兼容性矩阵中的S和X都是记录锁,就是这样吗?
答案 0 :(得分:0)
根据我的理解,锁兼容性矩阵中的S和X都是记录锁,它是对的吗?
这是正确的。不正确的假设是您可以直接比较表和记录锁,文档可能没有完全清楚,并且部分"这些规则可以通过以下锁定类型兼容性矩阵方便地汇总"可能有点误导,因为它没有涵盖所有内容(即有S
/ X
- 表锁与记录锁的任何冲突信息)
从技术上讲,该矩阵在检查某些对象上的锁时定义了结果,例如每当MySQL试图为某些东西添加锁定时。如果您尝试在表上获得S
锁定,则会与该表上的IX
锁定冲突。
如果记录可能有意图锁定,那么它也会发生冲突。仅仅因为可锁定对象不使用意图锁定并不会改变(通用)兼容性矩阵。
从技术上讲,锁的内部数据类型对于记录和表是相同的,意图锁永远不会为记录设置。实际上永远不会将记录锁与表锁进行比较(因为它们是两个不同的对象),并且记录锁定干扰表锁的唯一原因是锁定协议(需要锁定表和记录到锁定记录)。
因此,要锁定记录,通常需要不同的表锁。兼容性矩阵是相同的,但表的值可以并且通常不同于记录的值。
所以
因此,意图锁不会阻止除完整表请求之外的任何内容(例如,LOCK TABLES ... WRITE)。
是正确的,因为只有完整表请求需要与现有意图锁冲突的锁,并且记录不使用意图锁。但重复一遍:你仍然需要比较两个不同的锁。 S
- 对记录的锁定不能与表上的锁定冲突,因为这两个对象永远不会被比较。
手册是混合表和记录锁。它实际上将IS
和IX
定义为:
- 意图共享(IS):事务T打算在表t中的各行上设置S锁。
- Intention exclusive(IX):事务T打算在这些行上设置X锁。
所以如果你愿意,矩阵中的IS
和IX
可以在某种程度上被解释为行的属性(它们在技术上不是),而你将它们读作表中的锁(如它只能为表设置,但它是一个不同的锁)。但矩阵仍然只描述了比较记录(手册可能不够清楚)的情况,并且它不包含{{1}的任何兼容性信息}或S
表锁定。
总结一下:在上面的锁兼容性矩阵"中,你不需要"来解释与S锁的IX冲突,因为它根本不包括这种情况。