二阶段提交
常见的分布式事务解决方案:
- seata
- 消息队列
- saga
- XA
他们都有一个共同点,都是二阶段提交2PC,这四种常见的分布式事务解决方案分别对应着分布式事务的四种模式:AT 、TCC、Saga、XA
两阶段提交Two-Phase Commit,分为两个阶段:预处理阶段Prepare和提交阶段Commit
使用2PC来解决分布式事务一般会引入事务协调者的角色,它用来管理各个参与者,我们可以把参与者理解为数据库,也可以理解为应用,因为二阶段提交它是一种协议,它具有普遍适用性,它不是为某一种技术而制定的。就比如seata的AT模式中参与者就是数据库,而消息队列参与者又是应用。
2PC步骤:
第一阶段,预处理阶段
-
询问
协调者向所有参与者发送事务请求,询问是否可以执行事务操作,然后等待各个参与者的响应
-
执行
各个参与者接收到协调者事务请求后,执行事务操作(例如更新一个关系型数据表中的记录),并将Undo 和 Redo 信息记录事务日志中
-
响应
如果参与者成功执行了事务并写入的Undo 和 Redo信息,则向协调者返回YES响应,否则返回NO响应。当然参与者有可能宕机不返回响应
提交事务
-
commit事务
事务协调者向所有参与者发送commit请求
-
事务提交
参与者收到Commit请求后,执行事务提交,提交完成后释放事务执行期占用的所有资源
-
反馈结果
参与者执行事务提交后向协调者发送ack响应
-
完成事务
接收到所有参与者的ack响应后,完成事务提交
中断事务
在执行Prepare步骤过程中,如果某些参与者执行事务失败、宕机或者网络问题,那么协调者就无法收到参与者的YES响应,或者某个参与者返回了NO响应,此时,协调者就会进入回滚流程
-
rollback请求
协调者向所有参与者发送Rollback请求
-
事务回滚
参与者收到rollback后,使用Prepare阶段的Undo日志执行事务回滚,完成后是否事务执行期占用的所有资源
-
反馈结果
参与者执行事务回滚后向协调者发送ack响应
-
中断事务
接收到所有参与者的ack响应后,完成事务中断。
2PC问题