MySQL 2PC和3PC(二阶段提交和三阶段提交)

(1)背景:我们都知道,数据库本地事务可以通过ACID特性解决原子性、一致性和隔离性问题。然而,现在都是分布式系统,我们又该如何保证分布式资源的一致性问题呢?即一个完整的业务流程涉及到分布在不同资源管理器资源的状态变更,我们需要保证资源状态要不都变,要不都不变。这时我们就需要引入一个第三者-协调者,

(2)二阶段提交:

      阶段一:

      事务询问,协调者向所有参与者询问是否可以执行事务提交操作;

      执行事务,各参与者执行事务操作,资源管理器此时会将undo日志和redo日志计入事务日志中;

      参与者响应协调者,如果参与者成功执行事务,那么就返回Yes,如果执行失败,那么就返回No

      阶段二:

      协调者会根据各个参与者的反馈情况决定最终是否可以进行事务提交,包括两种情况:

      第一种,执行事务提交:

      发送提交请求,协调者向所有参与者发送commit请求;

      提交事务,参与者接收到协调者的commit请求后,会正式执行事务提交操作,之后释放执行期间占用的事务资源;

      反馈事务提交,参与者完成事务提交之后,向协调者发送Ack消息;

      完成事务,协调者接收到所有参与者反馈的Ack消息后,完成事务。

      第二种,中断事务提交:

      发送回滚请求,协调者向所有参与者发送rollback请求;

      回滚事务,参与者接收到协调者的rollback请求后,会利用阶段一记录的undo日志进行回滚操作,之后释放事务资源;

      反馈事务回滚,参与者完成事务回滚之后,向协调者发送Ack消息;

      中断事务,协调者接收到所有参与者反馈的Ack消息后,中断事务。

(2)三阶段提交:

      阶段一:

      事务询问,协调者向所有参与者发送CanCommit请求;

      参与者反馈,参与者接收到来自协调者的CanCommit请求之后,会根据自身情况反馈Yes或者No,Yes则进入预备状态。

      阶段二:

      协调者根据各个参与者的反馈情况确定是否进行PreCommit操作,包括两种情况:

      执行事务预提交,包括协调者发送预提交请求;参与者事务预提交;参与者响应协调者。

      中断事务,包括协调者发送中断请求;中断事务。

      阶段三:

      执行提交,进入这一阶段,事务会从预提交状态转换为提交状态,并向所有参与者发送DoCommit请求;事务提交;反馈提交结果;完成事务。

      中断事务,发送中断请求;事务回滚,利用二阶段记录的undo日志进行回滚;反馈事务回滚结果;中断事务。

你可能感兴趣的:(数据库,mysql,分布式)