TiCDC 不同表之间同步是有顺序的吗?一定要用事务才能保证吗?

想请问大家一个问题:
update table1 status = 开始
启动spark 大量插入数据 类似 insert xx into table2
update table1 status = 结束

在用TiCDC 从主TiDB 集群向从TiDB集群同步数据的过程中,如果出现异常情况。
可能会发生 table1 的 status = 结束 被同步到从集群,但是table2 的数据并没有传输完整吗?

确实可能会导致部分数据同步不完整。具体情况取决于异常发生的时间点

如果把他们放在一个事务里面能保证这个问题吗?

数据同步一致性

  • MySQL sink
    • TiCDC 不拆分单表事务,保证单表事务的原子性。
    • TiCDC 不保证下游事务的执行顺序和上游完全一致。
    • TiCDC 以表为单位拆分跨表事务,不保证跨表事务的原子性。
    • TiCDC 保证单行的更新与上游更新顺序一致。
1 个赞

也就是说我放在一个事务也无法保证吗?

不放一个事务更可以保证,ticdc其实是按修改提交的那个时间点按行同步数据的。
就是加入你执行下面三条语句,
update table1 status = 开始
commit;-------例如这时是2023年7月26日14:51:33
启动spark 大量插入数据 类似 insert xx into table2
commit;--------这时是2023年7月26日14:51:47
update table1 status = 结束
commit;-------这时是2023年7月26日14:52:07
那在cdc里面会产生三批数据,
依次是2023年7月26日14:51:33的table1 status = 开始的500行数据(假设table1有500行数据)→2023年7月26日14:51:47的table2的200行数据(假设插入了200行数据)→2023年7月26日14:52:07的table1 status = 结束的500行数据

反而放到一个事务,
update table1 status = 开始
启动spark 大量插入数据 类似 insert xx into table2
update table1 status = 结束
commit;--------例如这时是2023年7月26日14:57:56
这样会一下产生一批数据,是2023年7月26日14:57:56的table2的200行数据(假设插入了200行数据)和table1 status = 结束的500行数据。
这样的话,反而会出现你说的情况,例如下游table1 status = 结束的500行数据已经执行完了,但是table2的200行数据还没执行完,cdc已经异常了。

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。