分布式事务的四种解决方案,值得参考!

Posted Java技术栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式事务的四种解决方案,值得参考!相关的知识,希望对你有一定的参考价值。

Java技术栈

www.javastack.cn

                                                

分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。


例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。


在分布式系统中,要实现分布式事务,无外乎那几种解决方案。


一、两阶段提交(2PC)


两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。

1. 运行过程


1.1 准备阶段

协调者询问参与者事务是否执行成功,参与者发回事务执行结果。

分布式事务的四种解决方案,值得参考!1.2 提交阶段

如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。
需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接收到协调者发来的通知后,才进行提交或者回滚。

分布式事务的四种解决方案,值得参考!2. 存在的问题

另外推荐这篇: 。


二、补偿事务(TCC)


TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。它分为三个阶段:
  • Try 阶段主要是对业务系统做检测及资源预留

  • Confirm 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。
  • Cancel 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。

举个例子,假入 Bob 要向 Smith 转账,思路大概是:我们有一个本地方法,里面依次调用
  1. 首先在 Try 阶段,要先调用远程接口把 Smith 和 Bob 的钱给冻结起来。
  2. 在 Confirm 阶段,执行远程调用的转账的操作,转账成功进行解冻。
  3. 如果第2步执行成功,那么转账成功,如果第二步执行失败,则调用远程冻结接口对应的解冻方法 (Cancel)。
优点: 跟2PC比起来,实现以及流程相对简单了一些,但数据的一致性比2PC也要差一些
缺点: 缺点还是比较明显的,在2,3步中都有可能失败。TCC属于应用层的一种补偿方式,所以需要程序员在实现的时候多写很多补偿的代码,在一些场景中,一些业务流程可能用TCC不太好定义及处理。


三、本地消息表(异步确保)


本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。
  1. 在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。
  2. 之后将本地消息表中的消息转发到 Kafka 等消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。
  3. 在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。


分布式事务的四种解决方案,值得参考!

优点: 一种非常经典的实现,避免了分布式事务,实现了最终一致性。

缺点: 消息表会耦合到业务系统中,如果没有封装好的解决方案,会有很多杂活需要处理。


四、MQ 事务消息


另外推荐这篇:

优点: 实现了最终一致性,不需要依赖本地数据库事务。

缺点: 实现难度大,主流MQ不支持,RocketMQ事务消息部分代码也未开源。
通过本文我们总结并对比了几种分布式分解方案的优缺点,分布式事务本身是一个技术难题,是没有一种完美的方案应对所有场景的,具体还是要根据业务场景去抉择吧。笔者上家公司是试用阿里RocketMQ去实现的分布式事务,现在也有除了很多分布式事务的协调器,比如LCN等,大家可以多去尝试。

来源:my.oschina.net/ruoli/blog/3102315

- END -

推荐阅读:
1、
2、
3、
4、!
5、
关注 Java技术栈 公众号在后台回复: Java ,可获取一份栈长整理的最新 Java 技术干货。

点击「阅读原文」和栈长学更多~

以上是关于分布式事务的四种解决方案,值得参考!的主要内容,如果未能解决你的问题,请参考以下文章

分布式事务的四种解决方案

转 分布式事务的四种解决方案

Java分布式事务的四种解决方案

必须要讨论的四种分布式事务方案

Seata的四种模式介绍

连载redis库存操作,分布式锁的四种实现方式[三]--基于Redis watch机制实现分布式锁