分布式事务之三阶段提交3PC(内含个人感悟)

2022-07-26 17:11:49 浏览数 (1)

码农在囧途

我们得明白的一个事实是,在这样一个时代,我们想要做一番轰轰烈烈的事业基本上是不可能的,想要住上大别墅,开上豪车的可能性也不大,因为 我们的出生的地域,家庭背景,受教育程度,时代背景已经决定了我们能走多远,可能有些人会说你这是认命,没错,从某种意义来说,确实是认命. 我们身边不乏一些屌丝逆袭的案例,但是,我永远不寄托于此,那么,既然我们的一生注定要普普通通,过得比较辛苦,那么我们人生的意义究竟是什么, 我们的时代不像古时“大丈夫生于乱世,当带三尺剑立不世之功”,我们的环境到处是条条框框,普通人得到的消息和资源少之又少,所以,我们注定是 平凡的走过自己的一生,我们能做的是让平凡的人生不平庸,让平凡的人生闪耀出一点光,就像我们的父母,他们很幸苦,终其一生也没干成什么事业, 但是他们让一家人衣食无忧,完成了他们应尽的职责,还额外给了你很多帮助,那么,我们能说他们的一生是平凡的吗,如果从事业上来说,他们是平凡的,但是 从一个家庭来说,他们是伟大的,而我们也是如此,努力做好自己的事,找好心中的平衡点,那么我们其实也是幸福的,也是伟大的,一定要住上大房子 才会幸福吗,一定要开上豪车才会幸福吗,我觉得用心去做自己想做的事,从中找到快乐,找到价值,在自己的能力范围内让自己的身边变得美好一点,那才是真正的快乐, 我们别活在梦中,更别活在别人的话中。

前言

前面我们说了分布式事务的2PC模型,由于2PC阶段提交模型存在单点故障,事务阻塞等问题,所以就引出了3PC模型,3PC和2PC 很像,不过在3PC的基础上它加入一个预提交阶段,并引入了超时机制。

分布式事务之2PC

3PC就是三阶段提交,分别为CanCommitPreCommitDoCommit

CanCommit阶段

CanCommit阶段Coordinator协调者会向Participant参与者发送CanCommit消息,询问它是否可以执行操作,参与者收到消息 后如果他能够执行,那么就会返回给协调者能够执行的命令,我们用Yes,如果不能,那么就返回不能执行的命令,我们用No,那么能不能 的评判标准是什么呢,这要看实现者怎么去实现这个问题,可能会获取数据库锁资源,可能是其他。

如果参与者能够执行任务,那么返回协调者Yes状态

参与者不能执行任务,返回No,结束事务

PreCommit阶段

PreCommit阶段如果协调者收到参与者返回的状态值都为Yes,那么就证明它们都有能力去执行这个操作,那么协调者就会向所有参与者 发送PreCommit消息,协调者收到PreCommit消息后,就会执行本地事务,执行成功后将本地事务日志保存到undo_logredo_log 中,然后给协调者返回Yes,如果参与者执行本地事务失败,那么就返回给协调者No,协调者只要收到一个No消息,就会给所有参与者发送 中断事务abort消息,参与者收到abort消息会对事务就行回滚,因为第二阶段参与者与协调者都引入了超时机制,所以如果参与者没有收到 协调者的PreCommit消息,或者协调者没有收到参与者返回的预执行结果状态,那么在超过等待时间后,事务就会中断,这就避免了事务的阻塞。

协调者向参与者发送PreCommit,参与者预执行成功,返回Yes给协调者

参与者预执行失败,返回No给协调者

参与者预执行失败,返回No给协调者,协调者向参与者发送中断操作消息,中断事务

DoCommit阶段

协调者收到所有参与者返回的状态都是Yes,这时协调者就会向所有的参与者都发送DoCommit,参与者收到DoCommit后,就会真正地提交事务, 当事务提交成功后,就会返回给协调者Yes状态,表明我已经完成事务的提交,协调者收到所有的参与者都返回Yes,那么就完成本次事务,如果有一个 参与者返回No状态,那么就代表整个事务都要进行回滚,此时协调者就会向所有参与者都发送abort事务中断消息,参与者收到abort消息后,就会 进行事务的回滚。

DoCommit阶段如果参与者因为超时或者其他原因没有收到协调者发送的DoCommit消息,那么它也会去提交事务,因为其实在PreCommit阶段, 从某种意义上来说事务已经是成功了的,所以参与者会认为提交事务成功的可能性很大,所以依然会提交,那我们也可以说,只要PreCommit阶段所有参与者 都返回了Yes状态,那么只要进入第三阶段,事务基本上都能执行成功的。

协调者向参与者发送DoCommit消息,参与者全部返回Yes

某个参与者返回No,协调者会发送abort中断事务消息给所有参与者,让它们进行事务回滚

如果因为超时或者网络原因等没收到协调者发送的DoCommit或者abort消息,参与者也会去提交事务

总结

对于3PC我们就说完了,3PC是2PC的升级版,它引入了超时机制,解决了单点故障引起的事务阻塞问题,但是3PC依然不能解决事务一致性问题,因为在DoCommit 阶段,如果由于网络或者超时等原因导致参与者接收不到协调者发送过来的abort中断事务消息,那么过了超时时间,参与者会提交事务,本来应该是进行事务回滚的, 现在好了,提交事务了,那就就出现了数据不一致问题。

今天的分享就到这里,感谢你的观看,下期见

0 人点赞