Skip to content

异常与子事务屏障疑问 #559

@wuxudong

Description

@wuxudong
  1. 官方文档里 https://dtm.pub/practice/barrier.html#%E5%AD%90%E4%BA%8B%E5%8A%A1%E5%B1%8F%E9%9A%9C
Image

文档中的 唯一键是 全局事务id-分支id-分支操作(try|confirm|cancel)
但代码中的唯一键 是 UNIQUE key(gid, branch_id, op, barrier_id)

barrier_id 在每次 BranchBarrier.Call 都会递增

Image

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

Image

当 第5步, cancel 成功后丢包. 但 实际Cancel 已经成功, 且 barrier 表中 op:compensate 对应的记录也已经保存.
因为丢包. 所以 tm 发起第6步 再次cancel. 微服务A 收到请求后, 调用 BranchBarrier.Call. 但这里因为 barrier_id 递增. 所以 唯一索引不会拦截, barrier 再次插入成功, 又cancel 一次?

  1. 如果希望 barrier 是严格的, 那 barrier 的操作 需要和 业务 biz 的 db 操作在一个事务中. 但我看 example 中. barrier 表在 dtm_barrier 库中, 用户数据 user_account 在 dtm_busi 中. 因为db 事务无法跨库. 那 这里是不是 一致性有问题? 是不是 应该 barrier 和 业务表需要在一个db 库中.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions