首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL MVCC实现

MySQL MVCC实现
EN

Database Administration用户
提问于 2016-06-12 18:47:00
回答 1查看 905关注 0票数 3

问题是MySQL InnoDB表中同时选择和更新的行为:

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

三个问题:

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

回答 1

Database Administration用户

回答已采纳

发布于 2016-06-13 09:46:16

  1. InnoDB总是保存行的前一个版本。因此,每个更新都是一个选择的->复制->写入。它被保存多长时间取决于
    • 打开的事务(显然,只要您有一个需要能够看到旧版本的开放事务,它就不能被删除)
    • 您的服务器有多忙(清除延迟)

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

  1. 我不知道你所说的帮助是什么意思。你先读,然后更新,所以我看不出有多大的好处。您很可能不希望低于读提交的隔离级别。这将消除许多锁定问题(间隙锁下键锁定)。
  2. InnoDB重做日志包含在无害数据库表空间中发生的所有更改,以便在系统故障时能够恢复。格式是:页指针偏移量和更改的字节。因此,要回答显式用例,如果前面的版本被写入撤销空间(它就是这样),那么InnoDB也会将更改写入日志文件。

我希望这能帮到你!

如果您想了解更多的细节,我总是建议人们使用诺姆b_红宝石,这是一个非常方便的工具,可以查看无害数据库文件并理解操作的基本原则。

票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/141042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档