分布式事务是源于微服务的,服务之间的存在调用,且整个调用链路上存在多处写数据库表的行为,那么,分布式事务就是保证这些操作要么全部成功,要么全部失败。
分布式事务追求的一致性(业务特性
- 强一致性:任何一次读都能读到某个数据的最近一次写的数据(要求最高)
- 弱一致性:数据更新后,如果能容忍后续访问只能访问到部分或者全部访问不到,则是弱一致性(绝大多数的业务场景都是不允许的)
- 最终一致性:不保证在任意时刻数据都是完整的(状态一致),但是,随着时间的推移,数据总是会达到一致的状态。(异步操作)
常用的分布式事务的解决方案:
-
两阶段提交:指的是分两步提交:存在一个中央协调器负责协调各个分支的事务
-
本地消息表:是将需要分布式处理的任务通过消息日志的方式来异步执行
2.分布式事务解决方案 Seata AT 模式
2.1 概述
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务,官网 http://seata.io/zh-cn/
2.2 Seata的过程模型
-
Seata 中三个重要的角色:TC、TM、RM
2.3 Seata的事务模型
-
Seata定义了全局事务的框架,全局事务定义为若干分支事务的整体协调
2.4 Seata AT 模式的整体机制
- AT对业务代码完全无侵入性,使用非常简单,改造成本低,我们只需要关注自己的业务sql,Seata会通过分析我们的业务sql,反向生成回滚数据
2.5 Seata AT模式工作示例
-
两个全局事务tx1和tx2,分别对a表的m字段进行更新操作,m的初始值为1000
-
一阶段本地事务提交前,需要确保先拿到全局锁
-
拿不到全局锁,不能提交本地事务
-
拿全局锁的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。
-
-
如果tx1的二阶段全局回滚,则tx1需要重新获取该数据的本地锁,进行反向补偿更新操作,实现分支回滚。