MVCC Non-Blocking读取InnoDB的行锁定的正式名称?我在InnoDB和NDB的comparison table中遇到过这个词汇表;我不确定他们是相同的还是完全不同的东西。InnoDB的行锁定与MVCC非阻塞读取相同?
回答
MVCC非阻塞读,在某种程度上,锁定的没有。 MVCC使得一个或多个读取器可以获得对数据的可重复读取访问,即使在作者正在更新相同行时也是如此。在这种情况下不需要锁定。
例如,如果我更改某行,InnoDB立即创建该行旧版本的副本。读取该数据的并发事务可以继续读取副本。只要您的交易持续,该旧版本就会保留在数据库中。
如果您启动一个新事务,您将看到该行的最近提交版本,并且旧版本最终可能被垃圾收集,从而回收一些空间。
锁定是当多个作家正试图更新相同的行。只有一个编写者可以一次更新一行,并且第一个更新行将其锁定,直到他们提交更改。其他作家必须等到第一个作者提交。但至少在行级锁定时,如果它们正在更新相同的行,则它们只会有争用。
一个很好的资源,学习更多关于InnoDB的并发和锁定为@AlexYakunin High Performance MySQL, 3rd ed.
回复评论:
任意数量的并发线程可以获取在同一行上的共享锁。但是排他锁需要不存在任何类型的锁 - 一次只有一个线程可以获得排他锁。
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. Linux阻塞与非阻塞串行读取
- 2. 红宝石非阻塞行读取
- 3. mpi:阻塞与非阻塞
- 4. PHP非阻塞排他锁
- 5. 虚拟锁机制:非阻塞写入,读取和无效
- 6. 从非阻塞的SocketChanel读取信息
- 7. 阻塞和非阻塞读取之间有什么区别?
- 8. Android非阻塞从套接字读取
- 9. 非阻塞键盘读取 - C/C++
- 10. Python非阻塞pn532标签读取
- 11. 非阻塞读Scala中没有制定
- 12. 带'with'语句的非阻塞锁
- 13. 从C#中的标准I/O读取非阻塞读取#
- 14. MySQL InnoDB锁定行
- 15. 非阻塞连接()与WinSocks
- 16. 异步与非阻塞
- 17. 获取非阻塞命令行输出
- 18. 定时读取文件能否受益于非阻塞IO?
- 19. 如何在Perl中对管道进行非阻塞式读取?
- 20. 串行端口异步读取(非阻塞)+线程
- 21. 以非阻塞方式读取文本行
- 22. 如何使用asio执行非阻塞式读取?
- 23. MySql InnoDB可重复读取意外的锁定行为
- 24. 带延迟的阻塞/非阻塞
- 25. 从STDIN逐行读取,无阻塞
- 26. Java无阻塞读取
- 27. 流读取阻塞UDP GNAT
- 28. 非阻塞stdio
- 29. 非阻塞pthread_join
- 30. 非阻塞spmd
那么InnoDB共享锁的目的是什么?这是文档的一个正确部分: “如果事务T1在行r上持有排它(X)锁定,则不能立即授予来自某个不同事务T2的r上任一类型锁定的请求,而是事务T2必须等待事务T1释放其对行r的锁定。“ - 这意味着作家阻止读者。 – 2013-07-11 19:47:36
我提到的页面:http://dev.mysql.com/doc/refman/5.0/en/innodb-lock-modes.html – 2013-07-11 19:49:51
感谢您的澄清 - 我现在看到了这一点。共享锁实际上是显式应用的,或者是在SERIALIZABLE上的,或者它们有必要为DML语句正确提供隔离来更新具有FK的行。所以作家几乎从不阻碍读者。 – 2013-07-11 20:10:34