分布式事务
2020-06-30 本文已影响0人
策马踏清风
分布式事务
- 是什么
- 分布式事务就是一次大的事务操作由不同的小操作组成,这些小操作分布在不同的服务器上
- 分布式事务需要保证不同服务器上的小操作要不全部失败,要不全部成功。本质上是要保证数据库数据一致性
- 为什么需要分布式事务
- 当数据库单表一年产生数据超过
1000W
时就需要考虑分表,将一个数据库分成多个数据库。保证这些数据库的数据一致性就需要分布式事务 - 应用业务服务化(
SOA
),将之前单机应用变成由服务组成的微服务系统。分离出入订单系统、用户中心、库存中心、订单中心等。每个微服务都有自己的数据库。例如提交订单的操作,需要订单和库存同时操作,所以需要分布式事务保证下单成功库存减少,下单失败库存不变。
事务的特性ACID
- 原子性
A
整个事务中所有操作要不同时完成,要不全部失败 - 一致性
C
事务的执行必须保证系统的一致性,只要事务成功了,事务的操作就一定要体现在数据库中 - 隔离性
I
事务之间不会相互影响,一个事物的中间状态不会被其它事务感知 - 持久性
D
事务完成了之后事务对数据的操作就会完全保存在数据库中,停电宕机也会保存
基于XA
协议的两阶提交
- 名词解释
-
XA
是一个分布式事务协议,主要分为两个部分事务管理器和本地资源管理器 - 本地资源管理器通常由数据库实现,负责本地资源的提交和回滚
- 事务管理器作为全局调度者,负责调度本地资源
- 步骤
- 第一阶段:事务管理器通知各个本地资源管理器预备操作,本地资源管理器回复就绪(锁住资源)
- 第二阶段:事务管理器通知本地资源管理器提交,本地资源管理器回复成功
- 优缺点
- 优点是协议简单,大部分商业数据库(
Oracle
、DB2
等)都实现了XA
协议,使用分布式的成本较低。 - 缺点是性能差,在
mysql
中支持不理想(没有prepare
阶段日志,准备切换回导致主库和备库数据不一致),很多nosql
也没有XA
的支持。这些缺点也导致其应用狭隘
基于消息事务实现的最终一致性事务
- 解释
- 消息事务就是基于消息中间件的两阶段提交,是对消息中间件的特殊利用。此方法实现的事务是最终一致性,并不能保证实时一致。
- 步骤
- 系统A发送预备消息给中间件
- 中间件保存预备消息并返回
- 系统A执行本地事务
- 执行结束后发送给消息中间件
- 消息中间件保存信息并发送给其它系统
- 其它系统执行本地事务并返回(如果失败中间件会重复发送)
- mq将最终执行结果返回系统A
- 优缺点
- 性能好
2.缺点是如果其它系统一直不成功,会破坏一致性。
TCC编程模式
- 根据业务决定具体代码实现
- 一种编程框架,吧业务逻辑分为
Try``Confirm``Cancel
三个操作 - 例如下单,
Try
就是去库存,Confirm
是更新订单,Cancel
是失败恢复库存 - 本质是人为进行两段式提交