一、分布式事务
1.事务的概念
· 概念:事务是一个完整的、不可分割操作单元,整个事务要么全部执行成功,要么全部执行失败。
· 事务具备4个特性:ACID
A:原子性-->完整的、不可分割操作单元
C:一致性-->数据的一致性:事务开始前和事务结束后,数据总量不变
I:隔离性-->事务相互隔离,互不影响
D:持久性-->事务一旦提交,永久落盘
2.传统事务
传统事务由 数据库连接 来控制:只有是同一个Connection操作的数据库才能够控制住
JDBC:Connection对象
Mybatis:SqlSession
Spring:声明式事务
3.分布式事务
· 概念:在分布式系统中(即分布式环境下)的事务,称为分布式事务。
用人话来说:一个业务跨多个服务或数据源来实现,就是分布式事务。
· 存在的问题:
每个单独的服务都能在本地遵循ACID,但是它们互相之间没有感知,不知道有人失败了,无法保证最终结果的统一,也就无法遵循ACID的事务特性了。
这就是分布式事务问题,出现以下情况之一就可能产生分布式事务问题:
1) 业务跨多个服务实现
2) 业务跨多个数据源实现
如图所示:在一个下单业务中,需要交易服务、购物车服务、库存服务共同联合才能实现,三个服务又分别对应各自的数据库,各个服务的运行互不干涉影响。
如果某次下单的业务中,库存服务运行失败,库存的数据库不会更改,但交易的数据库和购物车的数据库已经更改,此时就导致数据出现不一致的问题。
· 解决:解决分布式事务的方案有很多,一般会使用开源的框架来解决分布式事务问题。
在众多的开源分布式事务框架中,功能最完善、使用最多的是阿里巴巴的Seata。
二、Seata解决分布式事务的方案
在Seata的事务管理中有三个重要的角色:
- TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。【TC相当于 监控器】
(TC是一个独立的微服务,需要单独部署。) - TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。【TM相当于 控制台】
- RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。【RM就是 各个微服务】
Seata的工作架构(流程)如图所示:
1)由TM确定"小兵数量":RM的范围,并向TC发起开启全局事务。
2)各个"小兵"RM到TC中“报到”(注册),并将事务的执行结果告知TC。
3)TC监控各个"小兵"RM的任务执行效果,反馈给TM,最后由TM决定全局事务该提交还是回滚。
Seata支持四种不同的分布式事务解决方案:
- XA
·事务的强一致性,满足ACID原则
·常用数据库都支持,实现简单,并且没有代码侵入
·为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
·依赖关系型数据库实现事务 - TCC
- AT
- SAGA
A是规范,目前主流数据库都实现了这种规范,实现的原理都是基于两阶段提交。
一阶段:
·事务协调者通知每个事务参与者执行本地事务。
·本地事务执行完成后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁。
二阶段:
·事务协调者基于一阶段的报告来判断下一步操作。
·如果一阶段都成功,则通知所有事务参与者,提交事务。
·如果一阶段任意一个参与者失败,则通知所有事务参与者回滚事务。
1.XA
1.1 XA模式的执行流程
1)由TM向TC发起开启全局事务;
2)TM调用分支RM;
3)RM到TM处报道注册;
4)RM执行sql(不提交);
5)RM将执行sql的结果告知TC;
6)TC监测全部RM的任务执行效果,反馈给TM;
7)TM决定全局事务该提交还是回滚,将命令交给TC;
8)TC向RM转达TC的命令,让RM执行提交或回滚事务。
1.2 XA模式的特点
· 优点
- 事务的强一致性,满足ACID原则
- 常用数据库都支持,实现简单,并且没有代码侵入
· 缺点 - 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
- 依赖关系型数据库实现事务
2.AT
2.1 AT模式的执行流程
1)由TM向TC发起开启全局事务;
2)TM调用分支RM;
3)RM到TM处报道注册;
4)RM执行并提交sql,并记录更新前后快照到undolog中
5)RM将执行sql的结果告知TC;
6)TM决定全局事务该提交还是回滚,将命令交给TC;
7)TC监测全部RM的任务执行效果,反馈给TM;
8)TC向RM转达TC的命令,让RM执行提交或回滚事务。
9)RM删除undolog中的数据或回滚恢复undolog中的数据
2.2 AT模式与XA的区别
- XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
- XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
- XA模式强一致;AT模式最终一致
简单来说,AT模式使用起来更加简单,无业务侵入,性能更好。因此企业90%的分布式事务都可以用AT模式来解决。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。