之前看了林奇的Mysql 45讲,里面提到了二阶段提交,看的一头雾水,后来又再别的地方看到了解释,这里做下记录,方便理解。
1.字面意思,说白了就是提交分两阶段,准备阶段和真实提交阶段
由于一个事件或者说事务,需要多方联动配合,即保持(数据,业务,状态)一致性,个人理解应该就是CAP中的A吧,
可能进行到其中某个环节,由于网络,服务不稳定啊(CAP中的P体现?),等等原因,导致后续环节没有执行,而前面的环节已经执行了,前面的环节并不知道后续环节执行失败,会默认和自己一样成功,从而修改当前环境的状态,数据等,就会出现数据的不一致。
简单来说,分布式系统,会出现数据不一致的问题。这是原因。
哪么为了解决这个问题,就得知道后续环节是不是成功了,如果没成功,大家都要按照每成功了,不能我成功了,你没成功,大概就是事务的一致性体现吧。
所以,需要知道到你这环你能不能执行,这个事情,理论上我认为可以由上游操作,得到反馈,但是可能是为了抽离,专门会有一个协作者的角色,来进行判断和指挥(服务只负责提供功能,流程控制由协作者指导)。
所以,协作者需要判断各服务是否可用,各服务是否能执行成功,这就是下面说的第一阶段。
2.准备阶段
协作者作为组织者,需要判断各个参与者是否可用,参与者需反馈给协作者,协作者进行确认即可进行第二阶段。
这里的意思看起来有点无用,直接让各参与者直接按照环节进行就可以,何必浪费这一步。
看了下Mysql讲义中,这一步貌似是进行了 Undo信息和Redo信息写入日志,即流程记录。记录当前事务发生到了哪个阶段,
如果到时候,后续哪个环节炸了,可以按照记录,将参与者都回滚到最初的状态,说白了,个人理解:准备阶段就是一个判断and记录功能。
如果参与者无法提供功能,则直接提示全部失败
参考:
https://juejin.im/post/5d6c7821518825415d062509