/xia栽ke:52xueit.com/587/
在接触分布式事务之前就听讲过好几种分布式解决方案,今天来剖析一下各方案的区别。最常用的应该是MQ的最终一致性的消息事务,在用MQ的过程中,你可能已经实现过分布式事务了。
初识分布式事务 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。 这里我们举个例子:例如在大型电商系统中,下单接口通常会扣减库存、减去优惠、生成订单 id, 而订单服务与库存、优惠、订单 id 都是不同的服务,下单接口的成功与否,不仅取决于本地的 db 操作,而且依赖第三方系统的结果,这时候分布式事务就保证这些操作要么全部成功,要么全部失败。 本质上来说,分布式事务就是为了保证不同数据库的数据一致性 2PC 两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。有以下两个阶段
首先是准备阶段,Coordinator会向所有事务参与者询问资源是否就绪,即有没有线程正在占用,是不是还处在其他事物当中,如果资源就绪了,就进行锁定,即表明这个资源正在参与分布式事务的流程中,将资源锁定不允许修改
然后到提交阶段,Coordinator向所有事务参与者发送提交信号,所有事务参与者就会进行事务的提交,有一个参与者失败则进行回滚 2PC的优点 尽量保证了数据的强一致,实现成本较低,在各大主流数据库都有自己实现,对于MySQL是从5.5开始支持。 2PC的缺点 同步阻塞:2PC的缺点也是显而易见的,它是一个强一致性的同步阻塞协议,事务执行过程中需要将所需资源全部锁定。 单点问题:协调者在整个流程中扮演的角色很关键,如果其宕机,比如在第一阶段已经完成,在第二阶段正准备提交的时候事务管理器宕机,参与者就会一直阻塞,导致数据库无法使用。 数据不一致:两阶段提交协议虽然为分布式数据强一致性所设计,但仍然存在数据不一致性的可能,比如在第二阶段中,假设协调者发出了事务commit的通知,但是因为网络问题该通知仅被一部分参与者所收到并执行了commit操作,其余的参与者则因为没有收到通知一直处于阻塞状态,这时候就产生了数据的不一致性。 3PC 3PC是2PC的一种改进版本,为了解决两阶段提交协议的阻塞问题即2PC的缺点,当协调者崩溃时,参与者不能做出最后的选择,就会一直保持阻塞锁定资源的状态。 2PC中只有协调者有超时机制,3PC在协调者和参与者中都引入了超时机制,协调者出现故障后,参与者就不会一直阻塞了。