分布式事务一致性之两阶段提交

来源:互联网 发布:韩国直播软件 编辑:程序博客网 时间:2024/05/29 18:59

1.分布式事务

分布式事务是指会涉及到操作多个数据库的事务。其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)
但是在分布式系统中,各个节点之间相互独立,通过网络进行进行沟通和协调,由于存在事务机制,可以保证每个独立节点的数据操作满足acid。上文提到,分布式事务处理的关键是其中所有的机器要么同一执行事务,要么统一撤销事务.为了分布式部署的机器能知道其他节点事务提交究竟是成功还是失败,所以解决办法是引入一个协调者

2.两阶段提交

在两阶段提交协议中,系统一般包含两类机器,一类为协调者,通常一个系统只有一个.另一类是事务参与者,一般包含多个,协调者向事务参与者下命令是否提交

2.1准备阶段

准备阶段也即投票阶段,
协调者通知事务参与者准备提交或者取消事务,每个参与者在本地执行事务,写本地的redo和undo日志但是不提交
在请求阶段分为如下三步

  1. 协调者节点向所有参与者节点询问是否可以执行提交操作,等待各参与者的响应
  2. 参与者节点执行事务操作,并写入undo和redo信息日志
  3. 参与者节点响应协调者节点发起的询问,如果参与者执行事务陈宫则发起同意,若执行事务失败则发起终止信息

2.2提交阶段

协调者从所有参与者节点获得的消息都为同意的时候,参与者和协调者执行如下过程

  1. 协调者节点向所有参与者发出”正是提交的请求”
  2. 参与者正式完成事务操作并释放整个事务期内占用的资源
  3. 参与者节点向协调者节点发送完成消息
  4. 协调者节点收到所有参与者反馈完成的消息后完成事务

如果协调者节点接收到任何参与者在第一阶段返回的响应消息为终止,或者协调者节点在准备阶段无法获取所有节点的响应消息的时候,参与者与协调者执行如下流程

  1. 协调者节点向所有参与者节点发出回滚请求
  2. 参与者根据undo日志进行回滚并释放事务期间内占用的资源
  3. 参与者向协调发送回滚完成消息
  4. 协调者接受到所有参与者返回的回滚完成消息后取消事务

3.两阶段提交存在的问题

  1. 同步阻塞问题:执行过程中所有参与的节点都是事务阻塞型的。当参与者占有公共资源的时候,其它线程将处于阻塞状态
  2. 单点故障:由于协调者发生故障,参与者会一直阻塞,若协调者在第二阶段宕机,即便重选出协调者,那么参与者仍然会阻塞在第二阶段,并长时间锁定事务资源,无法完成事务操作
  3. 数据一致性问题:若协调者向参与者发送commit请求之后,发生了局部网络异常或者在commit请求过程中,协调者宕机,导致只有一部分参与者接收到commit信息,而在这部分参与者接收到commit请求后就会执行commit,而未收到信息的节点会出现无法提交事务的情况,于是就出现了数据不一致的现象
  4. 二阶段无法解决的问题:协调者发出commit消息后宕机而唯一接收到这条消息的参与者同时也宕机了,即使选举出协调者,也无法知道此事务提交与否