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

问题描述

| MVCC Non-Blocking是否读取InnoDB的行锁定的正式名称?我已经在InnoDB和NDB的比较表中找到了该词汇表;我不确定它们是相同的东西还是完全不同的东西。     

解决方法

        MVCC非阻止读取在某种程度上是没有锁定的。 MVCC使一个或多个读取器即使在写入器更新同一行时也能获得对数据的可重复读取访问。在这种情况下,不需要锁定。 例如,如果我更改某行,InnoDB会立即创建该行的旧版本的副本。您的并发事务读取该数据可以继续读取副本。只要您的交易持续进行,该旧版本就会保留在数据库中。 如果开始新事务,您将看到该行的最新提交版本,并且最终可以对旧版本进行垃圾收集,从而回收一些空间。 锁定适用于多个编写者尝试更新同一行的情况。一次只有一个编写者可以更新一行,而第一个更新该行的作者将锁定该行,直到他们提交更改为止。其他作者必须等到第一个作者提交后才能进行。但是至少在行级锁定的情况下,它们只有在更新同一行时才有竞争。 第3版High Performance MySQL是学习更多有关InnoDB并发和锁定的好资源。 来自@AlexYakunin的评论: 任意数量的并发线程可以在同一行上获取共享锁。但是排他锁要求不存在任何一种类型的锁-一次只有一个线程可以获取排他锁。 UPDATE总是请求排他锁,这是更常见的情况。共享锁用于InnoDB中一些更特殊的情况: 我更新了具有父表外键的子行。我在子行上得到了X锁,在父行上得到了S锁。基本上,当我更新依赖于该父行的行时,没有人可以更新父行。 在阅读时,我明确使用use0ѭ阻止对某些行的更新。通常这不是必需的。 我在事务隔离级别为
SERIALIZABLE
时执行任何
SELECT
(这是不常见的)。 我发出导致重复键错误的INSERT,我的线程请求该行的共享锁。 有关更多详细信息和示例,请参见http://dev.mysql.com/doc/refman/5.6/en/innodb-locks-set.html。     ,        是:http://en.wikipedia.org/wiki/Multiversion_concurrency_control     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...