mysql:插入sql已提交,但数据不立即可见

问题描述 投票:0回答:1

我使用 MWAA 来运行我的 SQL 作业,这些作业在 RDS MySQL 社区上执行。例如,我从作业“A”开始,完成后,我继续运行作业“B”。

在作业“A”中,我使用插入 SQL 将数据插入到“a_table”中。完成后,作业'B' SQL 查询作业'A'插入到'a_table'的数据,然后将其插入到'b_table'。

目前,我观察到,虽然作业“A”已完成并提交,例如,将 10 条记录插入“a_table”,但逻辑上作业“B”应该检索这 10 条记录并将它们插入“b_table”。

但是,有时无法检索到所有记录;它可能只获取 8 条记录并将它们插入到“b_table”中。然而,如果我稍后为同一 DAG 手动重新运行作业“B”,它会成功从“a_table”中检索所有 10 条记录。

所以,我非常确定这不是 SQL 问题,而是运行作业“B”时出现的问题,有时,即使作业“A”,也并非“a_table”中的所有 10 条记录都写入“a_table”中已成功完成。

作业sql:

INSERT INTO a_table (
      DAG_START_TIME
    , DAG_END_TIME
    , A
    , B
    , C
    , UPDATE_TIME
)
SELECT
      %(start)s AS DAG_START_TIME
    , %(end)s AS DAG_END_TIME
    , A
    , B
    , C
    , UPDATE_TIME
FROM ABC
WHERE `DAG_START_TIME` = %(start)s
ON DUPLICATE KEY UPDATE
      `UPDATE_TIME` = CURRENT_TIMESTAMP(6)
;

b作业sql:

INSERT INTO b_table (
      DAG_START_TIME
    , DAG_END_TIME
    , A
    , B
    , C
    , UPDATE_TIME
)
SELECT
      %(start)s AS DAG_START_TIME
    , %(end)s AS DAG_END_TIME
    , A
    , B
    , C
    , UPDATE_TIME
FROM a_table
WHERE `DAG_START_TIME` = %(start)s
;

我检查了 RDS CPU 利用率和写入延迟,两者都远低于阈值水平。

对于如何解决这个问题有什么建议吗?这会对我有很大帮助。

sql mysql sql-insert mwaa
1个回答
0
投票

已提交事务的异步行为可能会导致可见性延迟,作业 B 可能无法立即看到所有记录。仍然确保作业 A 在 B 开始之前完全提交

  • 您可以在A和B之间添加延迟或等待,以确保A提交的数据对B完全可见

  • 您还可以提高事务隔离级别。默认通常是

    REPEATABLE READ
    ,你可能想尝试
    READ COMMITTED

如果您想更进一步,您可以考虑:

  • 实现数据验证逻辑[在B中,如果检索到预期数量的记录,则可以执行验证检查 - 如果没有,则在短暂等待后再次重试数据检索]
  • 调整 MySQL 配置 [
    innodb_flush_log_at_trx_commit
    sync_binlog
    等参数可能会影响事务的持久性和可见性]
© www.soinside.com 2019 - 2024. All rights reserved.