Seata是Alibaba提供的开源框架,提供了四种分布式事务的解决方案:
AT模型是2阶段段提交(2PC)协议的演变
第一阶段
写本地事务更新数据到本地数据库,申请全局事务id:
- 开启本地事务
- 执行update更新操作,执行sql语句更新数据到数据库
- 记录回滚日志UNDO_LOG:
- 记录afterImage: 更新之后的数据快照
- 记录beforeImage: 更新之前的数据快照
- 提交本地事务
- 将第一阶段执行结果提交给TC,交给第二阶段处理
第二阶段
根据第一阶段的执行结果决定是commit / rollback
如果是commit:donothing,因为第一阶段已经提交了
如果是rollback:从UNDO_LOG中找到修改之前的数据快照,进行回滚
如果rollback出错,TC会持久化回滚任务,不停重试直到回滚成功,所以这是基于应用层面逻辑实现UNDO_LOG回滚的弱一致性模型
写隔离(加全局锁):避免两个事务对同一条数据进行更改
如下图所示,假如tx1和tx2两个线程同时对一条数据进行修改
读隔离:默认读未提交(未提交的数据可以读到),可以开启读已提交功能
强一致性模型,数据库层面的二阶段提交
弱一致性模型,和XA类似,都是二阶段提交,只是TCC是代码逻辑层面二阶段提交
三个核心方法
TCC常见问题
基于事件驱动,性能更高
Seata的集成方式
复制两个文件到项目resources目录下
file.conf, registry.conf
不需要加file.conf和registry.conf文件