分布式事务: 主流最终一致性方案对比

【分布式】分布式事务方案:两阶段、TCC、SEATA 所谓一致性,是指数据在多个副本之间是否能够保持一致的特性。在聊一致性的时候,其实要搞清楚一致性模型。(概念挺多,但是没办法,这玩意它本身就是理论。想结合代码、示例都做不到,甚至想着画个图都不知道该如何下手)分布式系统中的一致性模型是一组管理分布式系统行为的规则。它决定了在分布式系统中如何访问和更新数据,以及如何将这些更新提供给客户端。面对网络延迟和局部故障等分布式计算难题,分布式系统的一致性模型对保证系统的一致性和可靠性起着关键作用。 阅读详情

分布式事务的最终一致性方案旨在确保在分布式系统中,所有参与方最终将达到一致的状态,尽管在过程中可能存在短暂的不一致。这种模型在保证系统可用性和分区容错性的同时,牺牲了强一致性的实时性要求。以下是几种主流的最终一致性方案的汇总与详解。

主流最终一致性方案对比

方案一致性模型性能实现复杂度典型适用场景核心思想
TCC最终一致高高金融、电商核心业务(如扣减库存)业务侵入补偿型事务,分为Try、Confirm、Cancel三个阶段。
Saga最终一致高高长流程、跨服务业务编排将长事务拆分为一系列本地事务,通过正向执行和反向补偿来保证最终一致。
本地消息表最终一致中中异步通知、对账场景利用数据库本地事务,将消息生产和业务操作绑定,通过异步轮询重试保证下游消费。
可靠消息(基于MQ)最终一致高低高并发、最终一致场景(如状态同步)借助消息队列的持久化、重试和确认机制,确保消息至少被成功消费一次。

方案详解与示例

1. TCC (Try-Confirm-Cancel)

TCC是一种业务侵入性较强的补偿型事务,要求每个服务提供三个接口:Try(预留资源)、Confirm(确认提交)、Cancel(取消释放)。

核心原理:在Try阶段锁定或预留必要资源,所有参与者Try成功后,在Confirm阶段提交;若任一Try失败,则在Cancel阶段执行补偿操作,释放预留资源。

适用场景:适用于对一致性要求较高且能容忍短暂资源锁定的核心业务,如电商下单时的库存扣减和优惠券核销。

代码示例(库存服务伪代码):

// 库存服务接口定义
public interface InventoryService {
    // Try: 预扣库存
    boolean tryDeduct(Long productId, Integer quantity);
    // Confirm: 确认扣减
    boolean confirmDeduct(Long productId, Integer quantity);
    // Cancel: 取消预扣,回退库存
    boolean cancelDeduct(Long productId, Integer quantity);
}

// 实现示例
@Service
public class InventoryServiceImpl implements InventoryService {
    @Override
    @Transactional
    public boolean tryDeduct(Long productId, Integer quantity) {
        // 检查并预扣库存(如将可用库存转入冻结库存)
        int rows = inventoryMapper.freezeStock(productId, quantity);
        return rows > 0;
    }

    @Override
    @Transactional
    public boolean confirmDeduct(Long productId, Integer quantity) {
        // 确认扣减,清除冻结记录
        return inventoryMapper.confirmFreeze(productId, quantity) > 0;
    }

    @Override
    @Transactional
    public boolean cancelDeduct(Long productId, Integer quantity) {
        // 取消预扣,将冻结库存加回可用库存
        return inventoryMapper.unfreezeStock(productId, quantity) > 0;
    }
}

2. Saga

Saga模式将一个分布式事务拆分为一系列连续的本地事务。每个本地事务都有对应的补偿事务。执行流程中,如果某个本地事务失败,则会按相反顺序触发前面所有已成功事务的补偿操作。

适用场景:适用于业务流程长、步骤多、跨多个服务的场景,如机票酒店预订流程。

实现模式:

  • 编排式:由一个中心协调器来触发并监听各个服务。
  • 协同式:每个服务完成后触发下一个服务,并知晓自己的补偿操作。

3. 本地消息表

该方案利用数据库的本地事务原子性,将消息生产和业务操作放在同一个事务中。

核心流程:

  1. 业务服务在完成本地数据库操作的同时,向同一数据库的“消息表”插入一条待发送的消息记录。
  2. 有一个独立的“消息发送者”定时轮询消息表,将未发送的消息投递到消息队列。
  3. 下游消费者从MQ消费消息,处理业务,处理成功后调用回调接口或发送确认消息。
  4. 消息发送者收到确认后,将消息状态更新为“已发送”或删除。

代码示例(订单创建与消息存储):

-- 在同一事务中执行订单创建和消息记录插入
START TRANSACTION;

-- 1. 创建订单
INSERT INTO `order` (order_id, user_id, amount, status) VALUES ('O001', 1001, 299.00, 'CREATED');

-- 2. 在本地消息表中记录待发送的“扣减库存”事件
INSERT INTO `outbox_message` (message_id, `topic`, payload, status, created_time)
VALUES (UUID(), 'inventory.deduct', '{"orderId":"O001","productId":"P1001","quantity":1}', 'PENDING', NOW());

COMMIT;

4. 可靠消息(基于消息队列)

此方案高度依赖消息队列(如RocketMQ、Kafka)的事务消息或类似机制来保证可靠性。

核心流程(以RocketMQ事务消息为例):

  1. 发送半消息:生产者向MQ发送一个“半消息”(对消费者不可见)。
  2. 执行本地事务:生产者执行本地业务逻辑(如创建订单)。
  3. 提交或回滚:根据本地事务执行结果,向MQ发送Commit或Rollback指令。
    • Commit:半消息变为正式消息,可供消费者消费。
    • Rollback:消息被丢弃。
  4. 消费与重试:消费者消费消息并处理业务。如果消费失败,MQ会按重试策略重新投递,直到成功或进入死信队列。

配置示例(RocketMQ生产者):

// 创建事务监听器,用于执行本地事务和检查本地事务状态
TransactionListener transactionListener = new TransactionListenerImpl();
TransactionMQProducer producer = new TransactionMQProducer("please_rename_unique_group_name");
producer.setNamesrvAddr("localhost:9876");
producer.setTransactionListener(transactionListener);
producer.start();

// 发送事务消息
Message msg = new Message("OrderTopic", "TagA", "OrderID001", "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = producer.sendMessageInTransaction(msg, null); // 第二个参数可用于传递业务参数

方案选型建议

  • 高并发与业务复杂:优先考虑TCC,因其性能好且业务控制粒度细。
  • 简单业务,允许延迟:使用本地消息表,实现相对简单,对中间件依赖小。
  • 长流程、跨系统编排:Saga模式更为合适,适合流程化的业务场景。
  • 已深度依赖消息队列:直接采用可靠消息方案,充分利用MQ的成熟能力实现最终一致。

在实际架构中,常组合使用多种方案。例如,一个电商下单系统可能:创建订单使用本地事务;扣减库存采用TCC或预扣库存;优惠券核销采用预冻结+最终扣减;而支付成功后的状态同步则通过消息队列保证最终一致性。系统必须设计完善的补偿机制,如订单超时未支付时触发库存回退和优惠券释放,并配合重试、告警等异常处理策略。


参考来源

 

AUTOSAR知识点:PDUR(PDU Router)基础知识 通过定义路由表和实现相应的路由和缓冲逻辑,PDUR能够确保PDU在不同ECU之间的可靠传输。在上述示例中,我们定义了一个简单的PDUR路由表,其中列出了源ECU和目标ECU之间的映射关系。当收到来自源ECU的PDU时,PDUR模块会根据路由表查找目标ECU,并将PDU传输到相应的目标ECU。PDUR的主要功能是将接收到的PDU从一个ECU路由到另一个ECU,并确保数据的正确传输。需要注意的是,上述示例是一个简化的实现,实际的PDUR模块可能包含更复杂的功能和逻辑。 阅读详情

相关推荐

STM32F103模拟SSI时序解析:实现高精度绝对式编码器位置读取

本文详细解析了如何在STM32F103微控制器上通过软件模拟SSI协议时序,实现高精度绝对式编码器的位置读取。文章从项目驱动出发,深入剖析了SSI通信原理、硬件电平转换连接、核心软件模拟代码实现及关键时序参数调试方法,并提供了使用示波器进行波形对齐与优化的实战指南,为成本敏感型工业控制与机器人项目提供了高性价比的解决方案。

weixin_29196315的博客 141

微服务分布式事务一致性:Seata AT 模式与消息最终一致的深度对比

分布式事务方案没有银弹,选型的核心是明确业务对一致性的容忍度。Seata AT 模式适合对一致性要求高、并发量中等的场景(如金融转账、订单支付),通过全局锁和 undo_log 保证强一致回滚。消息最终一致性适合对一致性容忍短时延迟、并发量高的场景(如电商下单、积分发放),通过本地消息表和幂等消费保证最终一致。落地路线建议:第一步,梳理业务场景,按一致性要求分级——强一致场景用 Seata AT,弱一致场景用消息方案;

dicky_zhang3的博客 2012

ENU坐标系实战:5分钟搞定无人机导航中的站心坐标转换

本文针对无人机导航中GPS坐标与视觉感知不匹配的定位漂移问题,提供了基于ENU坐标系的实战解决方案。通过Python代码演示了如何快速、精准地实现地心地固坐标与站心坐标之间的转换,并详细解释了转换原理、精度对比及工程优化技巧,帮助开发者从根本上解决局部相对定位不准的难题。

mqtt6iot的博客 552

分布式事务:微服务的数据一致性之困

分布式事务是微服务架构中最复杂的课题,没有之一。它的难度不在于技术实现,而在于理论限制——CAP 定理决定了在分布式系统中无法同时兼顾一致性和可用性。我们能做的不是消除分布式事务,而是在具体业务场景中选择合适的方案,在一致性、性能、可用性之间做出合理的取舍。对于大多数业务场景,最终一致性已经足够。通过可靠消息、本地消息表等方案,可以在不牺牲太多可用性的前提下,保证数据最终会一致。只有资金、库存等极少数对一致性要求极高的场景,才值得考虑 TCC 或 Saga 这类更复杂但一致性更强的方案。

愿此行,终抵群星 479

C#与Vector XL驱动库实战:CAN通道配置与端口访问详解

本文详细解析了使用C#调用Vector XL驱动库进行CAN总线通信开发的核心步骤。重点阐述了如何通过XL_GetDriverConfig获取硬件通道信息,并厘清channelMask与accessMask的区别与转换关系,最终指导开发者正确使用XL_OpenPort函数配置并打开CAN端口,为构建稳定的汽车电子测试与诊断应用奠定基础。

weixin_28452161的博客 362

TwinCAT3实战:从零搭建倍福PLC的Modbus-TCP Server

本文详细介绍了如何使用TwinCAT3从零搭建倍福PLC的Modbus-TCP Server,包括环境准备、工程配置、参数设置、客户端连接测试及常见问题排查。通过实战步骤和实用技巧,帮助工程师快速掌握倍福PLC与Modbus-TCP的通信实现,提升工业自动化项目的开发效率。

weixin_30797199的博客 173

分布式事务一致性解决方案对比

因此,2PC适用于对一致性要求极高、且参与方不多、事务执行时间较短的场景,如传统金融系统的内部模块间事务。具体流程为:1. 业务服务在执行本地事务的同时,将需要发送的消息写入同一数据库的“消息事件表”,与业务数据在同一事务中提交。第一阶段为“准备阶段”:协调者向所有参与者(Participant)发送准备请求,参与者执行本地事务的所有操作(如写日志、锁定资源),但暂不提交,并反馈是否可以提交。在CanCommit阶段,协调者询问参与者是否具备执行条件,此阶段不锁定资源,可提前发现无法执行的事务。

wqhyzl_621的博客 175

分布式事务解决方案深度对比:2PC、TCC、Saga、本地消息表

维度2PCTCCSaga本地消息表一致性强一致最终一致最终一致最终一致性能差好好好复杂度中高中低侵入性低高中低隔离性有有无无适用场景单库多表资金交易长流程异步通知推荐度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐。

2601_96649751的博客 211

[EdgeAI] NXP eIQ 机器学习Toolkit (一):准备篇

eIQ™机器学习(ML)软件开发环境支持在恩智浦EdgeVerse™微控制器和微处理器(包括i.MX RT跨界MCU和i.MX系列应用处理器)上使用ML算法。eIQ ML软件包括称为eIQ Toolkit的ML工作流工具以及推理引擎、神经网络编译器和优化库。............

HowieXue 薛永浩的博客 1万+

如何成为一名高级数字 IC 设计工程师(6-7)数字 IC 验证篇:DEBUG 技巧

不懂验证的设计不是好的设计;UVM 验证思维是指导缜密的芯片设计的导师;推荐书籍《芯片验证漫游指南》。

新芯设计的博客 1605

分布式事务方案对比:Saga、TCC、XA 在生产环境中的性能与一致性全景复盘

需要强一致性 + 低并发 → XA:银行、证券清算等对一致性有刚性要求且并发可预测的场景;需要最终一致性 + 中小规模 → TCC:电商下单、积分扣减等需要在 Try 阶段做资源验证的场景。TCC 的"预留而不扣"机制提供了比 Saga 更强的隔离性;需要最终一致性 + 长流程 + 高并发 → Saga:跨越多服务的长链路(订单→物流→通知),补偿操作的设计是核心挑战;无论选哪种方案,幂等性都是补偿操作的硬性要求:补偿可能被重复执行(网络重试、协调者崩溃),补偿逻辑必须是幂等的。推荐路径。

iymei4986533030的博客 2818

无线充电Qi协议正向通信FSK的解调设计

常见的FSK解调方法是使用频率锁相环(PLL)来跟踪输入信号中的频率变化。PLL根据输入信号的频率变化来生成数字信号,从而实现FSK信号的解调。本文将详细介绍无线充电Qi协议正向通信FSK的解调设计,并提供相应的源代码。在上述示例代码中,我们首先定义了FSK解调的参数,包括采样率、载波频率、每个比特的持续时间和比特判定阈值。最后,通过比较滤波后的信号与比特判定阈值,我们将解调后的数字数据转换为0和1的序列。请注意,上述代码仅为示例,实际的解调设计可能需要根据具体的应用场景和系统要求进行调整和优化。

IunScala的博客 2443

分布式事务实战:从ACID到最终一致性,主流方案与Seata应用解析

在分布式系统和微服务架构中,数据一致性是核心挑战之一。传统单数据库的ACID事务无法跨越服务边界,这引出了分布式事务的概念。其原理在于协调多个独立资源管理器,确保跨网络操作的一致性,技术价值在于支撑高并发、可扩展的互联网业务。应用场景广泛,例如电商下单扣库存、银行转账等典型业务。本文聚焦于两阶段提交、TCC、基于消息队列的最终一致性等主流方案,并深入解析Seata框架的AT模式,为处理数据不一致问题提供工程实践参考。

weixin_28318011的博客 220

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

分布式事务深度解析:场景、方案与实战

能不使用分布式事务,尽量不用合理设计边界,避免跨服务事务使用最终一致性替代强一致性根据业务场景选择合适的方案金融场景:强一致性(TCC)互联网场景:最终一致性(Saga/消息)做好幂等和补偿设计所有接口都要支持幂等完善的补偿机制。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1214

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

什么是分布式事务

分布式事务就是"跨多个服务的转账操作"单体应用:银行内部转账(一个数据库,用数据库事务保证)分布式系统:跨行转账(多个银行/数据库,需要协调)分布式事务没有银弹,核心是根据业务场景在一致性、可用性、性能之间做权衡。对于大多数互联网应用,基于消息的最终一致性是最佳选择。记住:能不用分布式事务就尽量不用,能异步就不要同步,能最终一致就不要强一致。

m0_51463746的博客 206

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

详解分布式事务

分布式事务解决方案概述 分布式事务用于协调跨节点、服务或数据库的操作,确保数据一致性。核心挑战包括网络故障、资源锁定和一致性保障。常见场景包括微服务调用、金融交易、库存管理等。主流解决方案: 2PC:强一致性,但存在阻塞和单点风险。 TCC:通过Try-Confirm-Cancel实现高可用,需业务补偿。 消息队列:异步最终一致性,适合高吞吐场景。 Saga:拆分长事务,通过补偿回滚保障。 Seata等中间件:集成多种模式,降低开发复杂度。 选择需权衡一致性与性能,金融场景倾向强一致(2PC/TCC),电商

wamp0001的博客 709

微服务分布式事务解决方案:Saga、TCC、本地消息表深度对比

分布式事务没有银弹,我们需要根据具体的业务场景选择合适的方案。在实际项目中,我通常会组合使用这些方案,以达到最佳的效果。这其实可以更优雅一点。希望这篇文章能帮助大家更好地理解和选择分布式事务方案。如果你有任何问题,欢迎在评论区留言。关于作者:我是 Alex,一个在 优快云 写 Java 架构思考的暖男。喜欢手冲咖啡,养了一只叫"Java"的拉布拉多。如果我的文章对你有帮助,欢迎关注我,一起探讨 Java 技术的优雅之道。

alex_goden的博客 4472

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

分布式事务的四种解决方案 一、两阶段提交(2PC) 两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。运行过程准备阶段协调者询问参与者事务是否执行成功,参与者发回事务执行结果。 提交阶段如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接收到协调者发来的通知后,才进行提交或

weixin_43761434的博客 942

分布式事务解决方案:Saga/TCC/消息队列——面试必问的分布式事务,你真的懂吗?

要点说明分布式事务问题跨多个数据库的数据一致性TCC模式Try-Confirm-Cancel,强一致性Saga模式正向执行+反向补偿,最终一致性消息队列异步处理+重试机制,最终一致性选型建议根据一致性要求、性能、复杂度选择今日互动你的项目中遇到过分布式事务问题吗?是用什么方案解决的?

sjkflw121150的博客 264

分布式事务解决方案Saga与TCC模式详解

TCC模式则更适用于对一致性要求高、执行时间短、资源竞争激烈的业务,如秒杀扣库存、实时支付等,其两阶段锁定机制能有效保证数据的强一致性。编排式Saga则没有中央协调器,每个服务在执行完本地事务后,通过事件驱动的方式触发下一个服务的执行,服务之间通过消息机制进行通信。TCC模式的强项在于其保证了事务的强一致性,且避免了长时间的资源锁定,提升了系统吞吐量。值得注意的是,两种模式并非互斥,在复杂系统中可以混合使用,例如在Saga的某个步骤内部采用TCC保证子事务的一致性。TCC模式:两阶段提交的柔性事务实现。

jipafp_010的博客 243

微服务分布式事务解决方案对比

相比之下,TCC(Try-Confirm-Cancel)模型通过预留资源、确认或取消操作实现最终一致性,更适合高并发场景。而Saga模式将长事务拆分为多个本地事务,通过补偿机制回滚,牺牲了部分实时一致性,但提高了系统可用性。2PC的实现相对简单,多数数据库和中间件提供原生支持,但故障恢复逻辑复杂。TCC通过一阶段的资源预留减少了锁竞争,性能优于2PC,但业务逻辑复杂度增加。在单体应用中,事务管理相对简单,而微服务环境下,数据分散在不同服务中,如何保证事务的一致性成为关键问题。

fylsue_343的博客 184

分布式事务管理

分布式事务管理是解决跨节点数据一致性的关键技术。本文系统梳理了分布式事务的核心概念、产生场景及5种主流解决方案:两阶段提交(2PC)提供强一致性但性能低;TCC通过业务拆分实现无锁化强一致;SAGA采用补偿机制实现最终一致;可靠消息和本地消息表基于异步通信保证最终一致。分析各方案的原理、优缺点及适用场景,强调需根据业务特性(如一致性要求、并发量)选择合适方案。特别介绍了Seata框架的4种模式,并指出实际应用中需注意幂等性、容错等问题。最后提出选型原则:金融等强一致场景选2PC/TCC,电商等高并发场景优先

阿鹏的博客 756

微服务数据一致性:分布式事务解决方案终极对比

在微服务架构中,数据一致性是保障系统可靠性的核心挑战。随着业务复杂度提升,传统单体应用的ACID事务已无法满足分布式场景需求,分布式事务解决方案成为微服务架构设计的关键环节。本文将深入对比主流分布式事务模式,帮助开发者选择最适合业务场景的一致性保障方案。 ## 分布式事务核心痛点解析 微服务架构下,数据被分散存储在不同服务的独立数据库中,跨服务操作时传统事务机制失效。典型挑战包括: - **

gitblog_00083的博客 569

分布式事务详细解读(CAP、两阶段提交、三阶段提交)

我们常见的单体结构的集中式系统,一般整个项目就是一个独立的应用,所有的模块都聚合在一起。明显的弊端就是不易扩展、发布冗重、服务治理不好做。 所以我们把整个系统拆分成若干个具备独立运行能力的计算服务的集合,而从用户的角度看,是一个完整的系统,但实际上,它是一个分布式服务的集合。

Javatutouhouduan的博客 376

Java实现分布式事务的多种方案详细对比分析

使用建议: TCC 更适合做一般事务框架的底层支撑,比如 Seata 就提供了 TCC 模式。使用建议: 如果您的应用程序规模不大,部署环境可控,可以考虑使用 JTA 的 Atomikos 或 Bitronix 来实现 2PC。像 Seata 这样的开源项目集成了多种模式(AT、TCC、Saga、XA),可根据业务演进逐步切换,是一个很好的起点。Saga 它是一种由事件驱动的补偿事务模式,将一个大事务分为多个本地事务,并通过事件链连接起来。该方案不追求强烈的一致性,而是通过消息队列实现异步通知和后续补偿。

2501_94114815的博客 35
上一篇: 分布式事务最佳实践:基于kafka实现的最终一致性方案
下一篇: Kafka消息不丢失全攻略
路飞说AI
博客等级 码龄10年 214粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值