MVCC非阻塞是否读取InnoDB的行锁定的正式名称?我在InnoDB和NDB的comparison table中遇到过这个词汇表;我不确定它们是相同的还是完全不同的东西。
答案 0 :(得分:4)
MVCC非阻塞读取在某种程度上是锁定的缺席。即使编写器正在更新相同的行,MVCC也允许一个或多个读取器获得对数据的可重复读取访问。在这种情况下不需要锁定。
例如,如果我更改某行,InnoDB会立即创建该行旧版本的副本。读取该数据的并发事务可以继续读取副本。只要您的交易持续,旧版本就会保留在数据库中。
如果你开始一个新的事务,你会看到该行最近提交的版本,旧的版本最终可以被垃圾收集,这会收回一些空间。
锁定是指多个编写者尝试更新相同的行时。只有一个编写器可以一次更新一行,而第一个更新行的编辑器会锁定它直到它们提交更改。其他作家必须等到第一个作家提交。但至少在行级锁定时,如果他们正在更新相同的行,他们只会有争用。
了解有关InnoDB并发和锁定的更多信息的好资源是High Performance MySQL, 3rd ed.
来自@AlexYakunin的评论:
任意数量的并发线程都可以在同一行上获取共享锁。但是,独占锁需要不存在任何类型的锁 - 一次只有一个线程可以获得独占锁。
UPDATE总是请求独占锁,这是更常见的情况。在InnoDB中,共享锁用于一些更具异国情调的案例:
我将具有外键的子行更新为父表。我在子行上获得X锁定,在父行上获得S锁定。基本上,当我更新依赖于父级的行时,没有人可以更新父行。
我在阅读时明确使用SELECT ... LOCK IN SHARE MODE
来阻止某些行的更新。通常不需要这样做。
我执行任何SELECT
而我的事务隔离级别为SERIALIZABLE
(这不常见)。
我发出导致重复键错误的INSERT,我的线程请求该行上的共享锁。
有关详细信息和示例,请参阅http://dev.mysql.com/doc/refman/5.6/en/innodb-locks-set.html。
答案 1 :(得分:0)