目录
一.事务&本地事务&分布式事务
事务
多个DML语句构成的一个单元。单元的多个DML语句要么全部执行成功,要么全部执行失败
A:原子性
C:一致性
张三--->李四100
张三-100
李四+100
I:隔离性
事务并发执行不应该相互影响。
Read Uncommited:脏读、不可重复读,幻读
Read Commited:不可重复读,幻读
Reaptable Read:幻读
串行化
D:持久性
事务一旦提交|回滚对数据库的映射是永久。
本地事务
对单一服务的服务操作数据库有效。服务对他连接的数据库的表进行多个DML操作
分布式事务
分布式系统架构中,多个服务协同完成某个业务。
即便操作是同一个数据库。
测试
下单业务中,保存订单(成功)
远程调用账户服务扣减余额(成功)
远程调用库存服务扣减库存(失败)
保存订单回滚
扣减余额(成功)
扣减库存(失败)
二.分布式系统架构2个理论
CAP
分布式系统架构有三个指标C A P
- Consistency(一致性):用户访问分布式系统中的任意节点,得到的数据必须一致
- Availability (可用性):用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝
- Partition(分区):因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区。
- Tolerance(容错):在集群出现分区时,整个系统也要持续对外提供服务
这三个指标不能同时满足
- 分布式系统节点通过网络连接,P:一定会存在
- 当分区出现时,系统的C A 是不能同时满足
BASE
- 基本可用
- 软状态:允许数据存在临时中间状态
- 最终一致性
- 在保证可用性的前提下,可以不保证强一致性。保证最终一致性。
强一致性
整个下单业务的分布式事务看成3个本地事务:保存订单本地事务,扣减库存本地事务,扣减余额的本地事务
2个阶段
1.预备
- TC通知所有的微服务,开启本地事务,执行业务sql
- 执行完sql后将结果回TC,YES/No
2.提交/回滚
- TC判断所有的微服务,返回的结果
- 全部都是YES,TC通知所有微服务提交本地事务
- 有一个是No,TC通知所有微服务提交回滚事务
最终一致性
整个下单业务的分布式事务看成3个本地事务:保存订单本地事务,扣减库存本地事务,扣减余额的本地事务
2个阶段
1.预备
- TC通知所有的微服务,开启本地事务,执行业务sql,在执行业务sql之前,将sql快照保存undo_log表
- 执行完sql如果执行成功提交本地事务
- 将执行结果返回TC,YES/No
2.提交/回滚
- TC判断所有的微服务,返回的结果
- 全部都是YES,删除undo_log表sql日志
- 有一个是No,TC通知执行成功微服务基于删除undo_log表sql日志进行反向操作。
三.seata
阿里巴巴旗下分布式事务框架
- TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
- TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
- RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
重要角色
1.TC
2.TM:jar包,订单服务
监控分布式事务方法运行。
开启分布式事务。
通知微服务注册分支事务
3.RM:jar包,让微服务和TC通信
seata事务模式
XA模式:
强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
XA模式的优点是什么?
- 事务的强一致性,满足ACID原则。
- 常用数据库都支持,实现简单,并且没有代码侵入
XA模式的缺点是什么?
- 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
- 依赖关系型数据库实现事务
TCC模式:
最终一致的分阶段事务模式,有业务侵入
AT模式:
最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
AT模式的优点:
- 一阶段完成直接提交事务,释放数据库资源,性能比较好
- 利用全局锁实现读写隔离
- 没有代码侵入,框架自动完成回滚和提交
AT模式的缺点:
- 两阶段之间属于软状态,属于最终一致
- 框架的快照功能会影响性能,但比XA模式要好很多
SAGA模式:
长事务模式,有业务侵入
XA
强一致性
1.启动TC(seata-server)
1.下载
2.解压
3.配置TC注册到那个注册中心;
4.配置TC所使用的配置中心;
5.创建TC连接数据库2.微服务中引入seata依赖
3.微服务中配置事务协调器地址
4.配置使用事务模式为XA
seata: data-source-proxy-mode: XA # 开启数据源代理的XA模式
5.@GlobalTransactional
AT
AT模式利用全局锁解决脏写。
1.启动TC(seata-server)
1.下载
2.解压
3.配置TC注册到那个注册中心;
4.配置TC所使用的配置中心;
5.创建TC连接数据库
2.微服务中引入seata依赖
3.微服务中配置事务协调器地址
4.配置使用事务模式为AT
6.@GlobalTransactional
7.在微服务操作的数据库中undo_log
8.TC操作的数据库中创建锁表;
简述AT模式与XA模式最大的区别是什么?
- XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
- XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
- XA模式强一致;AT模式最终一致
TCC
SAGA(不推荐,故省略)