gpt4 book ai didi

MySQL MVCC(InnoDB)

转载 作者:行者123 更新时间:2023-11-29 11:28:46 24 4
gpt4 key购买 nike

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

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

三个问题:

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

最佳答案

忽略问题,编写不会遇到麻烦的代码:

BEGIN;
SELECT id ... LIMIT 20; -- get list of _possible_ candidates for action
COMMIT;
**
foreach $candidate
BEGIN;
SELECT ..., is_candidate WHERE id = $candidate FOR UPDATE;
if still a candidate
process it
UPDATE ...;
COMMIT;

如果有人溜进来,比如在 ** 处,稍后的检查将防止双重处理。此外,第二个 BEGIN..COMMIT 可以防止任何人溜进去。

FOR UPDATE“锁定”该行;这很重要。

以这种方式处理的优点是交易很快,从而最大限度地减少对其他一切的影响。

关于MySQL MVCC(InnoDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37764677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com