如何解决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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。