(1)背景:我们都知道,数据库本地事务可以通过ACID特性解决原子性、一致性和隔离性问题。然而,现在都是分布式系统,我们又该如何保证分布式资源的一致性问题呢?即一个完整的业务流程涉及到分布在不同资源管理器资源的状态变更,我们需要保证资源状态要不都变,要不都不变。这时我们就需要引入一个第三者-协调者,
(2)二阶段提交:
阶段一:
事务询问,协调者向所有参与者询问是否可以执行事务提交操作;
执行事务,各参与者执行事务操作,资源管理器此时会将undo日志和redo日志计入事务日志中;
参与者响应协调者,如果参与者成功执行事务,那么就返回Yes,如果执行失败,那么就返回No
阶段二:
协调者会根据各个参与者的反馈情况决定最终是否可以进行事务提交,包括两种情况:
第一种,执行事务提交:
发送提交请求,协调者向所有参与者发送commit请求;
提交事务,参与者接收到协调者的commit请求后,会正式执行事务提交操作,之后释放执行期间占用的事务资源;
反馈事务提交,参与者完成事务提交之后,向协调者发送Ack消息;
完成事务,协调者接收到所有参与者反馈的Ack消息后,完成事务。
第二种,中断事务提交:
发送回滚请求,协调者向