MySQL锁兼容性

时间:2018-01-18 08:42:06

标签: mysql locking

根据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都是记录锁,就是这样吗?

1 个答案:

答案 0 :(得分:0)

  

根据我的理解,锁兼容性矩阵中的S和X都是记录锁,它是对的吗?

这是正确的。不正确的假设是您可以直接比较表和记录锁,文档可能没有完全清楚,并且部分"这些规则可以通过以下锁定类型兼容性矩阵方便地汇总"可能有点误导,因为它没有涵盖所有内容(即有S / X - 锁与记录锁的任何冲突信息)

从技术上讲,该矩阵在检查某些对象上的锁时定义了结果,例如每当MySQL试图为某些东西添加锁定时。如果您尝试在表上获得S锁定,则会与该表上的IX锁定冲突。

如果记录可能有意图锁定,那么它也会发生冲突。仅仅因为可锁定对象不使用意图锁定并不会改变(通用)兼容性矩阵。

从技术上讲,锁的内部数据类型对于记录和表是相同的,意图锁永远不会为记录设置。实际上永远不会将记录锁与表锁进行比较(因为它们是两个不同的对象),并且记录锁定干扰表锁的唯一原因是锁定协议(需要锁定表和记录到锁定记录)。

因此,要锁定记录,通常需要不同的表锁。兼容性矩阵是相同的,但表的值可以并且通常不同于记录的值。

所以

  

因此,意图锁不会阻止除完整表请求之外的任何内容(例如,LOCK TABLES ... WRITE)。

是正确的,因为只有完整表请求需要与现有意图锁冲突的锁,并且记录不使用意图锁。但重复一遍:你仍然需要比较两个不同的锁。 S - 对记录的锁定不能与表上的锁定冲突,因为这两个对象永远不会被比较。

手册是混合表和记录锁。它实际上将ISIX定义为:

  
      
  • 意图共享(IS):事务T打算在表t中的各行上设置S锁。
  •   
  • Intention exclusive(IX):事务T打算在这些行上设置X锁。
  •   

所以如果你愿意,矩阵中的ISIX可以在某种程度上被解释为行的属性(它们在技术上不是),而你将它们读作表中的锁(如它只能为表设置,但它是一个不同的锁)。但矩阵仍然只描述了比较记录(手册可能不够清楚)的情况,并且它包含{{1}的任何兼容性信息}或S 锁定。

总结一下:在上面的锁兼容性矩阵"中,你不需要"来解释与S锁的IX冲突,因为它根本不包括这种情况。