MySQL中的SX锁与更新锁是否相同

时间:2019-05-25 18:21:27

标签: mysql

根据All about locking in SQL Server,当有写入内容时,更新锁可以转换为互斥锁。同时,三个锁(X,S和U)的兼容性可以参考下表。

var brightness = MediaQuery.of(context).platformBrightness;
if (brightness == Brightness.dark)
  print("Dark mode");
else
  print("Normal mode");

但是,在某些博客中提到自MySQL 5.7以来就有一个SX锁,该锁实现了论文 B树上的操作并发性(1977)中的想法。从这些博客中,我发现SX锁与更新锁非常相似。例如,它们具有相同的兼容性表。

由于找不到关于MySQL中SX锁的更多“正式”介绍,因此我想问一下这两个锁之间有什么区别?

1 个答案:

答案 0 :(得分:2)

由于兼容性矩阵定义了一个锁,因此具有相同的矩阵将使更新锁和sx锁等效。

实际上,在数据库理论中,更新锁应表现为非对称,当已有更新锁时,不允许新的共享锁,请参见例如these lecture notes,倒数第二页。您的参考资料也提到了这一点:

  

重要的是要了解,更新锁在共享锁方面是不对称的。虽然可以将更新锁强加到具有共享锁的记录上,但是不能将共享锁强加到已经具有更新锁的记录上

实际上,MySQL sx-lock和SQL Server(及其他)更新锁都是对称的,就像在矩阵中一样。

更新锁的目的是允许其他事务仍然读取数据(使用共享锁),同时防止两个事务想要升级为排他锁时出现死锁(因为当另一个事务具有互斥锁时,两者都不能这样做)共享锁)。

因此,总的来说,锁类型在原则上是相同的,尽管我可以想象它们的名称有所不同,以强调它们并非旨在非对称,并且可能留出一个选择,以便以后添加“真正的”更新锁,因此您可能会也可能不想将它们视为不平等。

但是在使用方式上存在重大差异。例如,与SQL Server相比,MySQL不对行使用更新锁:MySQL使用排他锁进行更新,并允许并发读取,通常在读取时不锁定,除非您使用locking reads

在需要酸之后,详细的行为(何时对哪个对象执行哪个操作执行哪个锁)与性能和并发性最相关。虽然您可以为每个查询锁定整个数据库,但是一次只能允许一个查询,因此锁定特定对象的粒度越细,允许的并发性就越多(需要进行权衡以增加死锁的风险)。

现在已达到MySQL中sx锁的目的:

引入它们是为了允许对索引进行更精细的锁定,请参见MySQL-5.7 improves DML oriented workloads,因为对索引的某些操作要求完全锁定整个索引,从而阻碍了并发性。因此,它们在文档中不再出现的原因是,尽管将来可能还会有这种类型的其他用例,但它们目前仅限于非常特定的内部锁定。