分布式事务相关说明

分布式事务相关说明

一张图了解事务中的角色
在这里插入图片描述
XA 是由X/Open组织提出的分布式事务的规范。 XA规范主要定义了(全局)事务管理强(RM)和(局 部)资源管理器(RM)之间的接口。

事务的ACID 特性:
A (原子性):整个事务中的所有操作要么全做,要么全不做
C(一致性) :事务的执行必须保证系统的一致性,例如:A有200元,B有100元,一个事务里A成功转给B50元,只要事务执行成功了,那么最后A定是150元,B是150元
I (隔离型) :事务和事务之间互不影响,一个事务的中间状态是不会被其他事务感知
D (持久性) :事务一旦执行完成,那么事务操作的变更就会完全保存在数据库中

分布式事务出现原因:本来事务的参与者就在一个应用程序中,所以没有分布式事务的概念,但是由于微服务,SOA 架构的兴起,就产生了事务参与者在不同的应用程序中,多个程序中,比较难满足事务的ACID特性,所以才会有XA 协议的提出

XA包含两种实现 二阶段提交(2PC),三阶段提交(3PC)

二阶段提交

事务协调者:事务的发起者,事务参与者:事务的执行者

  1. 准备阶段 :
  • 事务协调者向所有的事务参与者发送事务信息,询问事务准备好提交事务,并等待回复。
  • 参与者接受到事务信息,开始执行事务操作,但是不提交事务(可以将相关操作记录日志),然后回复协调者,执行状态(准备状态ok/no)
  1. 提交阶段:
  • 协调者根据参与者回复状态,来确认事务是否提交,如果参与者中有一个返回状态为no,给所有的参与者发送事务回滚信息,否则发送提交信息
  • 参与者根据协调者发送的信息进行事务提交或者回滚
    在这里插入图片描述
    在这里插入图片描述
    2PC 问题:执行事务操作的时候,所有参与者处于同步阻塞状态,占用资源,容易产生性能瓶颈问题。如果协调者出现了问题,那么参与者将处于锁定状态,无法确保阶段2后,所有参与者在网络原因下全部收到消息(一部分收到了事务提交信息,一部分没有)
三阶段提交

基于二阶段提交,加入超时机制,在协调者和参与者中都加入了超时机制

canCommit 阶段

  1. 协调者向参与者发送canCommit 请求,询问事务是否可以提交
  2. 参与者收到请求后,根据自身状态,返回是否可以提交(yes or no),这个阶段并不执行事务操作

preCommit 阶段

  1. 协调者根据参与者上个阶段参与者返回的结果,进行处理,如果有一个返回no,则向所有参与者发送abort 请求,中断事务,否则向所有参与者发送preCommit 请求(2PC 中的准备阶段)
  2. 参与者如果收到abort 请求或者等待协调者请求超时,参与者都会中断事务,收到preCommit 请求,执行事务操作,记录相关日志,但不提交事务,然后返回执行状态( ack 响应或 no 响应)

doCommit 阶段

  1. 协调者收到preCommit 阶段 中参与者ack 响应,向所有参与者发送doCommit 请求。如果有preCommit阶段中参与者返回no响应,则发送abort 中断事务
  2. 参与者收到doCommit 请求 则提交事务,释放资源,返回ack响应,收到abort请求,中断事务并回滚,释放资源,返回ack响应
  3. 协调者收到ack 响应,完成事务提交或中断

阶段3中,无论协调者或者参与者出现网络问题,都会导致参与者无法接受到协调者的 do Commit 请求或 abort 请求,此时,参与者都会在等待超时之后,继续执行事务提交。

问题:数据不一致问题,也就是上面说的问题

参考的原文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值