将一个总体模块拆分为多个微服务,某些业务场景须要同时操做多个原子服务的数据,分布式事务就是用来保证多个原子服务数据源一致性的解决方案。算法
数据库分库分表:因为单表的数据量巨大须要分库分表,分库分表以后,此时一个操做可能涉及访问多个数据库,为了保证数据一致性,就须要用到分布式事务。 应用SOA化:指的是业务的服务化,将一个总体的系统拆分为多个子系统,每一个子系统都有本身的数据库,为了保证数据一致性,就须要用到分布式事务。数据库
两阶段提交的算法思路能够归纳为:参与者将操做成功或失败的结果通知协调者,再由协调者根据全部参与者的反馈状况决定个参与者是否要提交操做仍是停止操做。网络
在第一阶段协调者的询盘以后,各个参与者会回复本身事务的执行状况,这时候存在三种可能:异步
全部的参与者回复可以正常执行事务。分布式
一个或多个参与者回复事务执行失败。微服务
协调者等待超时。编码
当协调者和参与者同时出现故障时,两阶段提交没法保证事务的完整性。若是调者在发出commit消息以后宕机,而惟一接收到commit消息的参与者同时也宕机了。那么即便协调者经过选举协议产生了新的协调者,这条事务的状态也是不肯定的,由于没人知道事务是否已经被提交。spa
协调者向参与者发送事务执行请求CanCommit,参与者若是能够提交就返回YES响应,不然就返回NO响应。中间件
协调者根据参与者反馈的结果来决定是否继续执行事务的PreCommit操做,根据协调者反馈的结果,有如下两种可能:blog
TCC是一种比较成熟的分布式事务解决方案,可用于解决跨库操做的数据一致性问题,适用于公司内部对一致性、实时性要求较高的业务场景。其中Try、Confirm、Cancel 3个方法均由业务编码实现。其中Try操做为第一阶段,负责资源的检查和预留;Confirm操做为第二阶段,执行真正的业务操做;Cancel时执行取消(回滚)操做。 业务实现TCC服务以后,该TCC服务将做为分布式事务的其中一个资源,参与到整个分布式事务中;事务管理器分两阶段协调的TCC服务,第一阶段调用全部TCC服务的Try方法,在第二阶段执行全部TCC服务的Confirm或者Cancel方法。
2. 容许空回滚事务协调器在调用TCC服务的一阶段Try操做时,可能会出现由于丢包而致使的网络超时,此时事务协调器会触发二阶段回滚,调用TCC服务的Cancel操做;TCC服务在未收到Try请求的状况下收到Cancel请求,这种场景被称为空回滚;TCC服务在实现时应当容许空回滚的执行。
3. 防悬挂控制事务协调器在调用TCC服务的一阶段Try操做时,可能会出现因网络拥堵而致使的超时,此时事务协调器会触发二阶段回滚,调用TCC服务的Cancel操做;在此以后,拥堵在网络上的一阶段Try数据包被TCC服务收到,出现了二阶段Cancel请求比一阶段Try请求先执行的状况;用户在实现TCC服务时,应当容许空回滚,可是要拒绝执行空回滚以后到来的一阶段Try请求。
4. 幂等控制不管是网络数据包重传,仍是异常事务的补偿执行,都会致使TCC服务的Try、Confirm或者Cancel操做被重复执行;用户在实现TCC服务时,须要考虑幂等控制,即Try、Confirm、Cancel 执行一次和执行屡次的业务结果是同样的。
举例,假入 Bob 要向 Smith 转帐,思路大概是: 1. 首先在 Try 阶段,要先调用远程接口把 Smith 和 Bob 的钱给冻结起来。 2. 在 Confirm 阶段,执行远程调用的转帐的操做,转帐成功进行解冻。 3. 若是第2步执行成功,那么转帐成功,若是第二步执行失败,则调用远程冻结接口对应的解冻方法 (Cancel)。
基于本地消息的最终一致性方案的最核心作法就是在执行业务操做的时候,记录一条消息数据到DB,而且消息数据的记录与业务数据的记录必须在同一个事务内完成,这是该方案的前提核心保障。在记录完成后消息数据后,后面咱们就能够经过一个定时任务到DB中去轮询状态为待发送的消息,而后将消息投递给MQ。这个过程当中可能存在消息投递失败的可能,此时就依靠 重试机制 来保证,直到成功收到MQ的ACK确认以后,再将消息状态更新或者消息清除;然后面消息的消费失败的话,则依赖MQ自己的重试来完成,其最后作到两边系统数据的最终一致性。基于本地消息服务的方案虽然能够作到消息的最终一致性,可是它有一个比较严重的弊端,每一个业务系统在使用该方案时,都须要在对应的业务库建立一张消息表来存储消息。
RocketMQ中间件可以支持一种事务消息机制,确保本地操做和发送消息的异步处理达到本地事务的结果一致。
注:若是确认消息发送失败, RocketMQ会按期扫描消息集群中的事务消息 ,若是发现了Prepare消息,它会向消息的发送者确认本地事务是否已执行成功,而后再根据业务实现的策略决定时继续发送仍是回滚(消息生产者须要设置监听)。
举例,订单支付以后,支付宝向商户推送支付结果,若是商户没有回复Success,支付宝会重复推送N次支付结果。