You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MWAA调度RDS MySQL任务:A提交后B无法读取全量数据求助

问题描述

使用MWAA运行SQL任务,任务部署在RDS MySQL Community上,执行流程为任务'A'完成后再运行任务'B':

  • 任务'A'通过INSERT语句向a_table插入数据,包含ON DUPLICATE KEY UPDATE逻辑
  • 任务'B'查询a_table中任务'A'插入的数据,插入到b_table

当前问题:任务'A'显示完成并提交(比如插入10条记录),但任务'B'有时只能读取到8条;手动重新运行任务'B'则能读取到全部10条。已排除SQL语句问题,且RDS CPU、写入延迟均正常。

任务A的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
;

解决建议

  • 强制任务A的事务显式提交并校验写入结果
    检查任务A的数据库连接逻辑,确保执行完INSERT语句后显式调用COMMIT,同时通过ROW_COUNT()函数校验实际写入/更新的行数是否符合预期。MWAA标记任务完成仅代表代码执行结束,不代表数据库事务已完全提交落地。

  • 调整MySQL事务隔离级别
    若任务B的数据库连接使用**可重复读(Repeatable Read)**默认隔离级别,可能读取到事务提交前的快照数据。可在任务B执行查询前临时设置隔离级别为读已提交:

    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
    

    也可以直接修改RDS实例的默认隔离级别为读已提交。

  • 确保任务B连接RDS主实例
    如果任务B连接的是RDS只读副本,即使主实例写入延迟低,仍可能存在主从复制延迟导致数据未同步。直接让任务B连接主实例,或在查询前校验主从复制的二进制日志位置,确认数据同步完成。

  • 确认a_table的唯一约束配置
    任务A的ON DUPLICATE KEY UPDATE依赖唯一索引/主键,若DAG_START_TIME(或联合主键字段)没有唯一约束,可能导致重复插入,且索引未及时更新导致部分数据不可见。检查a_table的约束配置,确保索引状态正常。

  • 给任务B添加短延迟或重试逻辑
    在MWAA的任务B配置中,添加1-2秒的延迟后再执行查询,或设置失败重试机制(比如重试2次,每次间隔1秒),给数据库足够的时间完成数据落地和索引更新。

  • 显式控制任务A的事务边界
    MySQL中INSERT ... SELECT默认开启隐式事务,若任务A的代码未正确处理提交,可能存在事务未完全闭合的情况。可以在任务A的SQL开头添加START TRANSACTION,结尾添加COMMIT,显式管理事务周期。

内容的提问来源于stack exchange,提问作者helen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 00:52:39