分布式事务
mysql oceanbase tidb rocketmq msgBroker
TCC, XA,事务消息
本地消息表,执行本地事务,记录要发送某个消息,事务成功后,再由一个调度任务把消息发送出去,并且保证成功(不断重试,业务上要求消费方幂等,失败情况属于系统问题需要人工介入)。关键是调度任务。
seata
一个最基本的实现:
- 通过xid和各个份分支事务串起来整个分布式事务
- 为了支持回滚,在本地事务开启后,修改本地事务数据前,查询并记录undolog,持久化下来。在本地事务提交后,整个分布式事务回滚通过undolog来实现
- 事务的一致性:默认读为提交,读已提交需要业务加
select for update
悲观锁,也就是依赖本地事务的方式来实现
分布式锁的实现:
- mysql通过insert和索引保证正确性(integrity),加锁insert一条记录,释放锁delete掉
xid的生成:
{ip}{port}{uuid}
对AT模式暂时的疑问:
- 对acid支持可能非常弱,简单说转账和充值并发的场景,seata的undolog可能做不到一致性
- 同时性能也不会很好(事务过程中需要查询并记录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