真实配一对循环复制,停掉复制线程后往同一主键各自写入不同数据,重启复制看真实的冲突会怎么爆发、又留下什么样的真实后果。
代码-- r1和r2互为彼此的source(循环复制) -- 真实先停掉两边的复制线程,让两次冲突的写入都能各自在本地成功 STOP REPLICA; (在r1和r2上都执行) INSERT INTO app.events (id, msg) VALUES (100, 'from-r1'); -- 在r1上 INSERT INTO app.events (id, msg) VALUES (100, 'from-r2'); -- 在r2上
r1: id=100 msg='from-r1' r2: id=100 msg='from-r2' ← 真实两边此刻各自都合法,只是数据不一样
因为复制线程真实提前停掉了,这两条INSERT在各自本地都真实顺利通过了主键约束检查(此时对方那条真实还没同步过来),两边真实各自拥有了同一个主键、不同内容的一行数据——这是循环复制里冲突真实发生的经典前提:写入发生得足够接近,复制没能及时把对方的变更同步过来做冲突检测。
代码START REPLICA;(两边同时)
r1: Replica_SQL_Running: No
Last_Error: Worker 1 failed executing transaction '...r2-bin...'
(真实是应用r2那条INSERT时,撞上本地已经存在的id=100,Duplicate entry)
r2: Replica_SQL_Running: No
Last_Error: Worker 1 failed executing transaction '...r1-bin...'
(真实是应用r1那条INSERT时,同样撞上本地已存在的id=100)每一步都是本文上面用真实循环复制环境跑出来的原始结果。