4.1、方案一:两阶段提交协议(2PC:Two-Phrase Commit)
4.2、方案二:三阶段提交(2PC:Three-Phrase Commit)
1、什么是分布式事务
在分布式系统中保证不同节点之间的数据一致性。
2、分布式环境存在的问题
(1)网络通信:各节点间的【网络通信】可能存在延时、消息丢失、各节点间网络延时或不能通信;
(2)网络请求的状态:成功、失败、超时,对于超时情况调用方无法准确知道是否被处理;
3、为什么会有数据一致性问题?
为了保证高可用,数据被保留在不同物理机的,且会有多个副本,必须要保证这多个副本间的数据是一致的; 这样做的好处是:
(1)可用性:消除单点故障,防止某台机器宕机后,数据不可用;
(2)性能:通过负载均衡技术、让不同机器上的备份数据对外提供服务,可提高数据库的性能。
4、分布式事务实现方案
处理分布式事务的关键是要知道 事务在任何地方所做的动作,提交或回滚必须产生一致的结果;
4.1、方案一:两阶段提交协议(2PC:Two-Phrase Commit)
该协议将事务的拆分为两个阶段:投票阶段和事务提交
(1)、投票阶段:
a、协调者逐个发送请求,并等待【参与者】的逐个回复;
b、参与者收到【是否ready】的请求后,执行事务但不提交,记录事务日志(Undo Log和Redo Log);
c、参与者反馈自己是否ready给【协调者】,并阻塞等待【协调者】的后续指令;
(2)、提交阶段
以上为正常情况,如果在【投票阶段】任一参与者本地事务执行失败或未在约定时间内返回,则协调者会向所有的参与者发送【回滚】命令,所有参与者执行本地事务的回滚;
(3)、两阶段提交的缺点:
(1)性能问题:由于要轮训所有的参与者,各个节点都占用者数据库资源;
(2)协调者单点故障:协调者故障,所有参与者接收不到提交或回滚通知,参与者一直处于中间状态无法完成事务。
(3)丢失消息导致数据不一致:在【提交阶段】如果发生网络问题,一部分参与者提交了事务提交命令,而另一部分参与者没有收到事务提交命令,一直处于阻塞状态,
会导致数据不一致。
4.2、方案二:三阶段提交(2PC:Three-Phrase Commit)
(1)三阶段提交可以解决两阶段提交的中的性能问题和一定程度上的由于单点故障导致的数据不一致问题,三阶段分为:can_commit,pre_commit,do_commit,分别对应图中的1、2、
3阶 段:
说明:上图中在第1阶段有三种结果:
(1)询问参与者、且都能正常执行事务;
(2)有一个或者多个参与者返回不能执行事务;
(3)协调者等待参与者超时
对于第(1)种结果会进入第二阶段的操作,但是如果发生第(2)、(3)种情况,则如下:
对于上述图中第2、3阶段如果任一参与者返回失败,则协调者都会发送回滚操作;
(3)优点:
三阶段提交提高了数据一致性:参与者在等待一定时间超时后自动commit ,解决了因为协调者挂掉导致的参与者接收不到提交命令的问题而导致的数据一致性问题。
提高性能:先询问参与者如果不能执行事务那么也不会先锁定资源;
4.3、方案三:MQ事务
(1)、使用消息中间件来完成事务的后一段更新,保证最终的一致性,可以提高性能,实现如下:
4.4、方案四:TCC事务
5、分布式事务的最终一致性
数据一致性:在等待一定时间超时后,自动commit,解决了因为协调者挂掉导致的参与者接收不到提交命令的问题;但是并不能从根本上解决分布式事务的数据一致性问题,在分布式数据库中,如果期望达到数据的强一致性,那么服务基本没有可用性可言,这也是为什么许多分布式数据库提供了跨库事务,但也只是个摆设的原因,在实际应用中我们更多追求的是数据的弱一致性或最终一致性,为了强一致性而丢弃可用性是不可取的。
转载:https://my.oschina.net/fileoptions/blog/899991
https://my.oschina.net/wangzhenchao/blog/736909
https://my.oschina.net/xianggao/blog/548579