-
Notifications
You must be signed in to change notification settings - Fork 998
Open
Description

文档中的 唯一键是 全局事务id-分支id-分支操作(try|confirm|cancel)
但代码中的唯一键 是 UNIQUE key(gid, branch_id, op, barrier_id)
barrier_id 在每次 BranchBarrier.Call 都会递增

那这里有一个疑问.
例如文档中的这个图

当 第5步, cancel 成功后丢包. 但 实际Cancel 已经成功, 且 barrier 表中 op:compensate 对应的记录也已经保存.
因为丢包. 所以 tm 发起第6步 再次cancel. 微服务A 收到请求后, 调用 BranchBarrier.Call. 但这里因为 barrier_id 递增. 所以 唯一索引不会拦截, barrier 再次插入成功, 又cancel 一次?
- 如果希望 barrier 是严格的, 那 barrier 的操作 需要和 业务 biz 的 db 操作在一个事务中. 但我看 example 中. barrier 表在 dtm_barrier 库中, 用户数据 user_account 在 dtm_busi 中. 因为db 事务无法跨库. 那 这里是不是 一致性有问题? 是不是 应该 barrier 和 业务表需要在一个db 库中.
Metadata
Metadata
Assignees
Labels
No labels