MySQL MVCC实现
作者:互联网
问题是关于MySQL InnoDB表中同时SELECT和UPDATE的行为:
我们有一个相对较大的表,我们定期扫描读取几个字段,包括一个名为LastUpdate的字段.在扫描期间,我们更新以前扫描的行.更新是在后台线程中批处理并执行的 – 使用不同的连接.请务必注意,我们更新已读取的行.
三个问题:
> InnoDB是否会保存以前版本的更新行,因为SELECT仍在进行中?
>使用READ-UNCOMMITTED进行SELECT帮助吗?
>如何确认InnoDB在其重做日志中保存或不保存修改行的先前版本.
解决方法:
> InnoDB始终保存该行的先前版本.所有内容都是写入时的副本,因此每次更新都是一个选择 – >复制 – >写.保留多长时间取决于
>开放交易(显然只要你有一个开放的交易,需要能够看到旧的版本,它无法删除)
>你的服务器有多繁忙(清除滞后)
在最近的版本中,清除行为得到了很大改善.如果您有兴趣,请查看dev.mysql.com以获取更多信息.
>我不确定你的意思是什么.你先阅读并下次更新,所以我没有看到太多的好处.您很可能不希望低于READ-COMMITTED隔离级别.这将消除很多锁定问题(gap locks和next-key locking).
> InnoDB重做日志包含innodb表空间中发生的每个更改,以便在系统出现故障时能够恢复.格式为:页面指针偏移量和更改的字节数.因此,如果将先前版本写入撤消空间(即它),则回答显式用例,那么InnoDB也会将该更改写入日志文件.
我希望这有帮助!
如果你想更多地查看细节,我总是建议人们使用innodb_ruby,这是一个非常方便的工具,可以查看innodb文件并理解操作的基本原理.
标签:isolation-level,mysql,innodb 来源: https://codeday.me/bug/20190806/1600617.html