我使用 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 利用率和写入延迟,两者都远低于阈值水平。
对于如何解决这个问题有什么建议吗?这会对我有很大帮助。
已提交事务的异步行为可能会导致可见性延迟,作业 B 可能无法立即看到所有记录。仍然确保作业 A 在 B 开始之前完全提交
您可以在A和B之间添加延迟或等待,以确保A提交的数据对B完全可见
您还可以提高事务隔离级别。默认通常是
REPEATABLE READ
,你可能想尝试 READ COMMITTED
如果您想更进一步,您可以考虑:
innodb_flush_log_at_trx_commit
或 sync_binlog
等参数可能会影响事务的持久性和可见性]