MySQL MVCC 实现

nim*_*odm 3 mysql innodb isolation-level

问题是关于 MySQL InnoDB 表中同时 SELECT 和 UPDATE 的行为:

我们有一个相对较大的表,我们定期扫描读取多个字段,包括名为 LastUpdate 的字段。在扫描期间,我们更新先前扫描的行。更新在后台线程中批处理和执行 - 使用不同的连接。需要注意的是,我们更新已读取的行。

三个问题:

  1. InnoDB 是否会保存更新行的先前版本,因为SELECT它仍在进行中?
  2. READ-UNCOMMITTED用于SELECT帮助吗?
  3. 如何确认 InnoDB 在其重做日志中保存或不保存修改行的先前版本。

Kár*_*agy 5

  1. InnoDB 总是保存行的先前版本。一切都是在写入时复制,因此每次更新都是选择 -> 复制 -> 写入。保存多久取决于

    • 开放交易(很明显,只要你有一个开放交易,需要能够看到旧版本,它就不能被删除)
    • 您的服务器有多忙(清除滞后)

    清除行为在最近的版本中得到了很大改善。如果您有兴趣,请查看 dev.mysql.com 以获取更多信息。

  2. 我不确定你说的帮助是什么意思。你先阅读然后更新,所以我看不到太多好处。您很可能不想低于 READ-COMMITTED 隔离级别。这已经消除了很多锁定问题(间隙锁定下一键锁定)。

  3. InnoDB 重做日志包含innodb 表空间中发生的所有更改,以便在系统故障时能够恢复。格式为:页指针偏移量和改变的字节数。因此,如果先前版本被写入撤消空间(它是),那么要回答显式用例,那么 InnoDB 也会将该更改写入日志文件。

我希望这有帮助!

如果您想查看更多细节,我总是建议人们使用innodb_ruby,这是一个非常方便的工具,可以查看 innodb 文件并了解操作的基本原理。