分布式事务
分布式事务是指会涉及到操做多个数据库的事务。其实就是将对同一库事务的概念扩大到了对多个库的事务。算法
分布式事务中须要注意的是分布式系统中存在的一致性问题;mongodb
CAP原则:在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼;数据库
主要的典型的协议和算法:分布式
二阶提交协议(Two Phase Commitment Protocol);函数
三阶提交协议(Three Phase Commitment Protocol);spa
Paxos算法;.net
其中,二阶提交协议和三阶提交协议就是根据“XA规范”衍生出来的。orm
XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范(即接口函数),交易中间件用它来通知数据库事务的开始、结束以及提交、回滚等。 XA 接口函数由数据库厂商提供。中间件
能够说二阶段提交其实就是实现XA分布式事务的关键(确切地说:两阶段提交主要保证了分布式事务的原子性:即全部结点要么全作要么全不作,也就是原子性)blog
2PC
参与者将操做成败通知协调者,再由协调者根据全部参与者的反馈情报决定各参与者是否要提交操做仍是停止操做;
所谓的两个阶段是指:
第一阶段:准备阶段(投票阶段);
第二阶段:提交阶段(执行阶段);(选择提交或者回滚)
2PC的缺点:1.同步阻塞;2.单点故障;3.数据不一致;4.宕机致使事务状态未知;
3PC
3PC:二阶段提交(2PC)的改进版本;
一、引入超时机制。同时在协调者和参与者中都引入超时机制。
二、在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段以前各参与节点的状态是一致的。
三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段;
注意:在doCommit阶段,若是参与者没法及时接收到来自协调者的doCommit或者rebort请求时,会在等待超时以后,会继续进行事务的提交;
In order to, 成功提交的概率很大,由于已经进入doCommit阶段了;
补充
不管是二阶段提交仍是三阶段提交都没法完全解决分布式的一致性问题。
世上只有一种一致性算法,那就是Paxos,全部其余一致性算法都是Paxos算法的不完整版。
小记:MongoDB中不支持真正的事务,只能经过程序实现事务特性;也就是MongoDB官方所讲的2PC(Two Phase Commits两阶段提交),试图在必定程度上能保证数据最终的一致性,可是应用程序仍是可能会读到提交或者回滚过程当中的中间数据;
更详细的话,看这里: