gpt4 book ai didi

mysql - InnoDB 的行锁定与 MVCC 非阻塞读取相同吗?

转载 作者:可可西里 更新时间:2023-11-01 07:33:34 26 4
gpt4 key购买 nike

MVCC Non-Blocking Reads是InnoDB行锁的正式名称吗?我在 comparison table 中遇到过这个词汇表对于 InnoDB 和 NDB;我不确定它们是同一种东西还是完全不同的东西。

最佳答案

MVCC 非阻塞读取在某种程度上是没有锁定。 MVCC 使一个或多个读取器能够获得对数据的可重复读取访问,即使写入器正在更新相同的行。在这种情况下不需要锁定。

例如,如果我更改了某行,InnoDB 会立即创建该行旧版本的副本。您读取该数据的并发事务可以继续读取副本。只要您的交易持续,旧版本就会保留在数据库中。

如果您启动一个新事务,您将看到该行的最新提交版本,而旧版本最终会被垃圾回收,从而回收一些空间。

锁定用于多个 作者试图更新相同行的情况。一次只有一个作者可以更新一行,第一个更新行的作者会锁定它,直到他们提交更改。其他作者必须等到第一个作者提交。但至少在使用行级锁定时,它们只有在更新相同 行时才会发生争用。

学习更多关于 InnoDB 并发和锁定的好资源是 High Performance MySQL, 3rd ed.


来自@AlexYakunin 的评论:

任意数量的并发线程都可以获取同一行上的共享锁。但是独占锁要求不存在任何一种类型的锁——一次只有一个线程可以获得独占锁。

UPDATE 总是请求独占锁,这是更常见的情况。共享锁用于 InnoDB 中一些更奇特的情况:

  • 我将具有父表外键的子行更新。我在子行上获得了 X 锁,在父行上获得了 S 锁。基本上,当我更新依赖父行的行时,没有人可以更新父行。

  • 我在阅读时明确使用 SELECT ... LOCK IN SHARE MODE 来阻止对某些行的更新。这通常不是必需的。

  • 我在事务隔离级别为 SERIALIZABLE 时执行任何 SELECT(这并不常见)。

  • 我发出导致重复键错误的 INSERT,我的线程请求对行的共享锁。

参见 http://dev.mysql.com/doc/refman/5.6/en/innodb-locks-set.html了解更多详情和示例。

关于mysql - InnoDB 的行锁定与 MVCC 非阻塞读取相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6321647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com