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

