分布式事务

mysql oceanbase tidb rocketmq msgBroker

TCC, XA,事务消息

本地消息表,执行本地事务,记录要发送某个消息,事务成功后,再由一个调度任务把消息发送出去,并且保证成功(不断重试,业务上要求消费方幂等,失败情况属于系统问题需要人工介入)。关键是调度任务。

seata

逸仙电商 Seata 企业级落地实践

一个最基本的实现:

  1. 通过xid和各个份分支事务串起来整个分布式事务
  2. 为了支持回滚,在本地事务开启后,修改本地事务数据前,查询并记录undolog,持久化下来。在本地事务提交后,整个分布式事务回滚通过undolog来实现
  3. 事务的一致性:默认读为提交,读已提交需要业务加select for update悲观锁,也就是依赖本地事务的方式来实现

分布式锁的实现:

  1. mysql通过insert和索引保证正确性(integrity),加锁insert一条记录,释放锁delete掉

xid的生成: {ip}{port}{uuid}

对AT模式暂时的疑问:

  1. 对acid支持可能非常弱,简单说转账和充值并发的场景,seata的undolog可能做不到一致性
  2. 同时性能也不会很好(事务过程中需要查询并记录undolog),还需要和seata服务端的交互,包括加锁和事务协调

看了几个相关的github的issue,也大致印证了。

2021-04-26 11:57:09 +0800 yajw Update 2021-03-27 分布式事务.md M
2021-04-26 11:47:25 +0800 yajw Update 2021-03-27 分布式事务.md M
2021-03-27 14:49:15 +0800 yajw Copy old posts A