1 分布式事务
1.1 事务的四个特性 ACID
Atomicity 原子性
事务中所有的操作要么一起提交,要么一起回滚。
Consistency 一致性
事务一旦提交,数据就会从一个一致性状态,到达另一个一致性状态。
Isolation 隔离性
一个事务中对数据的更改不会影响到另一个事务中的数据。
Durablity 持久性
一旦事务提交,那么对于数据库的更改就是永久的。
1.2 事务场景
假设有这么个场景,用户下单购买商品,则会调用订单中心让其生成订单记录,同时调用库存中心让其扣除商品库存。这两个中心都有着各自的数据库。这期间就有可能会出现:
订单记录生成失败,但是商品库存扣除成功
订单记录生成成功,但是商品库存扣除失败
这样就会导致数据不一致的问题,因此这时候就需要分布式事务来解决这类问题。
由此可见分布式事务主要为了保障一个请求在多个微服务调用链中,对于微服务所造成数据修改的原子性问题。
2 XA协议
XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准。目前,Oracle、Informix、DB2和Sybase等各大数据库厂家都提供对XA的支持。XA协议采用两阶段提交方式来管理分布式事务。XA接口提供资源管理器与事务管理器之间进行通信的标准接口。
2.1 两阶段提交 2PC
2.1.1 处理流程
准备阶段
- 事务管理者向事务参与者发起Prepare消息,询问其是否能够正常执行事务,并开始等待其回应。
- 事务参与者接收到Prepare消息后,开始执行本地事务,但并未真正提交,同时将undo、redo信息写入日志。
- 事务参与者根据本地事务的执行情况,返回Ready或Rollback消息给事务管理者。
提交阶段
所有事务参与者都返回Ready消息
- 事务管理者发送Commit消息给事务参与者
- 事务参与者接收到Commit消息后,会正式提交事务,并释放被锁定的资源。
- 事务参与者在事务提交后,返回Ack给事务管理者
事务参与者中任意一个