资讯动态

分布式事务全套原理:从本地事务底层推导出分布式事务、Spring传播、Seata四大模式、2PC脑裂、内外一致性完整闭环

发布时间:2026/9/24 11:54:49 来源:尧图企业网站定制
摘要本文从本地事务的 Connection 边界出发推导分布式事务的诞生逻辑系统讲解 Seata AT/TCC/XA/Saga 四大模式的适用场景、底层原理与生产瓶颈重点区分「对内可控」与「对外不可控」两套一致性体系补齐 Spring 事务传播坑、2PC 脑裂、全链路幂等、正逆向补偿、金融级日终对账等高频盲区形成一套完整的数据一致性知识闭环。全文总纲我对分布式事务的理解分为两层核心体系分界线非常清晰对内可控场景服务、数据库、代码均自主可控可基于 Seata 各类模式实现资源层分布式事务一致性对外不可控场景无法操控第三方数据库、无法要求对方实现补偿逻辑只能通过业务层的回调、轮询、对账实现最终一致性。贯穿所有一致性方案的底层基石是幂等性与状态机核心取舍原则可控靠框架做强一致不可控靠业务补一致强一致必然牺牲性能高并发场景只能接受最终一致。一、根基数据库本地事务一切事务的起点1.1 本地事务核心定义本地事务指单个数据库实例、同一个Connection会话内数据库原生提供的ACID能力。核心铁律MySQL事务边界绑定 ConnectionSession会话同一个Connection中多条SQL天然具备原子性数据库保证全部成功或全部回滚。不同Connection哪怕操作同一实例、同一个库的不同表也是两个独立事务彼此提交、回滚互不影响。1.2 Spring本地事务本质Spring的Transactional不会创造事务能力只是基于AOP对JDBC事务做封装方法执行前获取连接、开启事务 → 方法正常执行完毕则提交事务 → 抛出异常时执行回滚。事务生效的核心前提是走Spring AOP代理。1.3 Spring 7种事务传播行为精准工程版传播行为解决的核心问题带有事务注解的A方法调用同样标记事务注解的B方法B该如何处理当前事务上下文1可创建事务核心3种REQUIRED默认外层存在事务则复用无事务则新建。内外共用同一个事务。核心坑精准说明内层带Transactional方法抛出异常被AOP代理拦截后会标记全局事务rollback-onlytrue就算外层catch捕获异常提交阶段依然整体回滚。前提内层方法必须走AOP代理同类this调用无代理、注解失效不会触发该机制。REQUIRES_NEW无论外层有无事务都会新建独立事务与数据库连接挂起外层事务。内外事务完全隔离互不影响。适合日志记录场景主业务失败日志依旧留存。NESTED外层存在事务则创建savepoint保存点无事务则新建事务复用同一个Connection。底层与兼容性精准说明NESTED 依赖 JDBC 3.0 的 Savepoint 机制MySQL InnoDB 原生支持Oracle 支持 Savepoint。关键工程约束Spring 本地事务的DataSourceTransactionManager支持 NESTED但分布式事务场景使用的JtaTransactionManager不支持嵌套事务。在 Seata 分布式事务上下文中使用 NESTED会直接抛出 NestedTransactionNotSupportedException分布式跨库场景严禁使用。内层失败仅回滚至保存点外层可继续提交外层一旦回滚所有保存点一并回滚。2随缘复用事务SUPPORTS有事务上下文则加入事务执行无事务就以非事务方式运行多用于查询方法。3校验拦截型不主动创建事务NOT_SUPPORTED永远不启用事务。外层携带事务时先挂起外层事务执行完成后恢复。MANDATORY强制要求外层必须存在事务没有事务直接抛出异常。NEVER禁止上下文存在事务检测到外层事务直接报错。1.4 本地事务工程最佳实践尽量避免多层嵌套事务不依赖复杂传播行为。**Transactional**一组需要保证原子性的SQL统一收拢到同一个公共方法。内部业务逻辑抽为私有方法不再添加事务注解规避AOP代理失效、传播行为异常等问题。核心避坑同类内使用this调用事务方法不走AOP代理事务直接失效。二、关键推导本地事务的局限性催生分布式事务本地事务能力存在明确边界仅能保障单实例、单连接、单一资源的原子性。遇到下面场景单纯本地事务无法保证多操作原子性业务操作跨多个数据库实例、多库多数据源同一数据库实例但代码使用多个独立Connection执行SQL业务流程跨异构资源数据库、Redis、MQ、第三方HTTP接口多个独立资源各自拥有本地事务缺少统一协调器就会出现部分资源提交成功、部分执行失败引发数据不一致。为解决跨多资源的原子性问题分布式事务应运而生。2.1 分布式事务两种口径工程口语口径跨机器、跨数据库实例才算分布式事务同一实例多连接仅属于多连接本地事务。XA/JTA规范口径一个全局事务管理多个XAResource独立资源即为分布式事务哪怕是同一数据库实例。三、对内可控场景公司内部系统一致性方案Seata体系适用前提服务、数据库都由内部维护代码可改造、可新增数据表、可增加业务补偿逻辑。可借助Seata框架实现标准化分布式事务。3.1 Seata AT互联网业务首选一阶段执行业务SQL记录数据快照写入undo_log直接提交本地事务并释放锁二阶段正常完成则删除undo日志全局事务回滚时读取快照生成补偿SQL进行回滚。优点是锁释放快并发性能高业务无侵入。【隔离性说明】Seata AT 一阶段本地事务已提交全局锁只防写冲突不防读。因此其他事务能读到未完成的中间状态效果上等价于「读未提交」这也是Seata官方定义的AT模式默认全局隔离级别。业务解决脏读三种成熟方案原理案例前置回顾Seata AT 为什么会脏读AT一阶段就提交本地事务undo_log仅用于记录数据快照。举个典型场景全局事务执行扣库存、扣余额操作一阶段执行完毕后数据库数据已更新但全局二阶段尚未提交。此时其他查询会读到未落地的中间数据若全局事务最终回滚该查询数据就会变成无效脏数据。核心根源就是AT全局锁只拦截写操作不拦截读操作。方案1业务状态机控制只查询已成功终态忽略中间态数据核心原理不在数据库层面做隔离在业务层通过状态字段固定流转规则过滤中间态数据从业务视图屏蔽脏数据无需牺牲并发性能。通用业务状态设计INIT初始化/处理中中间态禁止查询、SUCCESS全局提交终态允许查询、FAIL全局回滚终态允许查询。核心规则所有业务查询强制过滤中间态仅查询终态数据全局事务二阶段完成后才更新为成功/失败终态彻底规避脏读。业务案例下单订单场景1. 开启Seata AT全局事务创建订单初始化状态为 INIT处理中2. 一阶段执行扣库存、扣余额本地事务提交数据库数据更新但订单状态仍为中间态 INIT3. 全局事务成功二阶段提交完成订单状态更新为 SUCCESS事务失败则回滚数据状态更新为 FAIL4. 业务查询SQL强制过滤 INIT 状态仅查询终态数据彻底屏蔽中间脏数据。查询SQL示例-- 只查询终态过滤处理中INIT的中间脏数据select*fromt_orderwhereorder_id?andorder_statusin(SUCCESS,FAIL);✅优点无锁、高并发、改动小互联网业务主流方案❌缺点仅能解决单据类业务脏读无法解决纯数值表库存、余额脏读强依赖代码规范适用场景订单、履约、工单等带业务单据主表的场景方案2select for update 悲观锁查询牺牲并发换取隔离性核心原理普通查询不触发Seata全局锁校验可直接读到中间态数据而select ... for update属于排他写锁会主动向TC申请全局写锁。若当前数据正在被AT全局事务修改持有全局锁查询请求会阻塞等待直到全局事务二阶段提交/回滚、释放锁资源后才会执行查询最终读到稳定终态数据。业务案例库存超卖校验-- 悲观锁查询触发Seata全局锁校验阻塞等待事务终态selectstock_numfromt_goods_stockwheregoods_id100forupdate;时序演示1. 事务A执行库存扣减AT事务一阶段更新库存数据持有TC全局锁2. 事务B通过for update查询同一商品库存申请全局锁失败线程阻塞3. 事务A二阶段完成释放全局锁4. 事务B获取锁成功查询到最终稳定库存数据无脏读。✅优点数据库层面生效隔离可靠无需改造业务状态❌缺点查询阻塞大幅降低并发能力热点数据易触发超时适用场景库存、资金强校验可接受短暂阻塞的低冲突核心场景方案3核心资金、库存交易改用TCC业务层精准控制资源可见性核心原理AT脏读的本质缺陷一阶段提交本地事务提前修改业务数据暴露中间状态。TCC从根源解决问题Try阶段仅冻结资源不修改真实业务数据Confirm阶段才正式更新数据。在事务未最终确认前业务主表数据无任何变更外界永远读到稳定原始数据彻底杜绝脏读。业务案例账户资金扣减金融核心场景表设计账户余额主表 资金冻结记录表1. Try阶段仅新增冻结记录余额主表数据不变无任何业务数据变更2. 所有分支Try执行成功进入Confirm阶段正式扣减冻结资金更新余额主表3. 事务异常则进入Cancel阶段删除冻结记录资金全额解冻数据无变更。✅优点从根源杜绝脏读隔离性最强抗热点争抢、稳定性极高❌缺点业务侵入性强需手动实现三段接口处理空回滚、悬挂、幂等三大问题适用场景资金账户、热点库存、金融核心等高精密、高争抢交易三种方案横向对比总结方案隔离原理并发性能开发成本适用场景业务状态机过滤业务层过滤中间态仅查询终态高低订单、工单、履约单据业务select for update悲观锁查询抢占TC全局锁阻塞等待事务终态低低库存预校验、可接受阻塞的强一致场景TCC模式冻结与业务数据分离Confirm才更新数据高很高资金、热点库存核心交易【生产级精准瓶颈AT并非高并发通杀】AT 整体并发优异但在极端高并发、热点行争抢场景存在三大硬性瓶颈undo_log 表膨胀与IO压力每一条分支事务都会生成并写入undo日志高并发下单表读写压力极大且需要定时归档清理否则会造成存储堆积、拖慢回滚效率。TC全局锁串行瓶颈虽然本地数据库行锁释放极快但 TC 端的全局锁是串行争抢机制针对同一库存、同一账户等热点行高频更新场景全局锁会成为整个系统的并发瓶颈。大事务回滚性能差全局回滚时需要逐条读取undo_log快照、反向拼装补偿SQL大事务数据量大时回滚耗时久、阻塞风险高。场景最终取舍Seata AT 只适合「高并发、低数据冲突」的通用业务针对热点行频繁更新、高争抢的核心交易场景优先使用 TCC。3.2 Seata XA数据库原生2PC依赖XADataSource与数据库原生XA能力标准两阶段提交。一阶段执行XA PREPARE预执行SQL、锁定资源、写日志但不提交二阶段接收TC指令执行commit或rollback。优点强一致、业务无侵入缺点prepare阶段长期持有行锁锁持有时间等于全局事务整体耗时并发性能极差存在2PC阻塞、脑裂缺陷仅适合低并发、极致强一致场景。3.3 Seata TCC高并发、跨异构资源分为Try、Confirm、Cancel三段接口Try做资源校验与冻结Confirm确认提交、正式执行业务Cancel取消操作、释放冻结资源。无数据库锁性能高可对接数据库、Redis、第三方接口。缺点业务侵入性极强必须手动处理幂等、空回滚、防悬挂三大核心问题。高频概念解析空回滚、悬挂以及基于事务状态表的通用解决方案空回滚指 Try 未执行成功Cancel 却被触发悬挂指 Cancel 先执行、后续 Try 正常执行导致资源永久冻结。很多人会疑惑为什么空回滚、悬挂只涉及 Try 和 Cancel不涉及 Confirm TCC 三阶段执行顺序Try资源冻结→所有分支 Try 全部成功→Confirm确认提交只要任意一个 Try 失败全局事务就走向Cancel。 Confirm 有硬性前置条件全部分支 Try 执行成功。空回滚、悬挂本质是网络异常TC 提前下发 Cancel 指令此时全局事务已经判定失败Confirm 阶段根本不会触发所以异常时序问题只发生在 Try 与 Cancel 之间。通用解决方案通过事务状态表记录分支阶段实现空回滚识别与防悬挂拦截1TCC 分支事务状态表生产通用建表语句CREATE TABLE tcc_transaction_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT, global_tx_id VARCHAR(64) NOT NULL COMMENT 全局事务ID全局唯一, branch_tx_id VARCHAR(64) NOT NULL COMMENT 当前分支事务ID每个TCC分支一条记录, branch_status TINYINT NOT NULL COMMENT 分支状态0初始1_TRY_SUCCESS2_CONFIRM_SUCCESS3_CANCEL_SUCCESS, create_time DATETIME, update_time DATETIME, UNIQUE KEY uk_branch_tx (branch_tx_id) );核心设计branch_tx_id作为唯一标识一条分支事务只存在一条记录标记当前分支走到了哪个执行阶段。重要约束状态表的读写操作必须和业务冻结 / 释放逻辑放在同一个本地事务中。保证状态记录与业务操作原子性要么一起成功要么一起回滚防止状态和业务数据不一致。2Try 方法执行逻辑Transactional public Result try(BranchTxDTO dto) { String branchTxId dto.getBranchTxId(); // 第一步查询当前分支事务状态 TccRecord record mapper.selectByBranchId(branchTxId); if(record ! null) { if(record.getStatus() TRY_SUCCESS){ // 重复Try幂等处理直接返回成功不重复冻结资源 return Result.success(); } if(record.getStatus() CANCEL_SUCCESS){ // 【防悬挂核心】该分支已经执行完Cancel拒绝执行Try冻结逻辑 return Result.fail(该分支已执行Cancel禁止执行Try防止资源悬挂); } } // 执行业务Try逻辑仅冻结资源不扣减真实业务余额 boolean freezeOk freezeBusinessResource(dto); if(!freezeOk){ // Try业务失败不写入状态记录直接返回失败 return Result.fail(); } // Try业务执行成功写入状态记录 insertRecord(branchTxId, TRY_SUCCESS); return Result.success(); }3Cancel 方法执行逻辑Transactional public Result cancel(BranchTxDTO dto) { String branchTxId dto.getBranchTxId(); TccRecord record mapper.selectByBranchId(branchTxId); // 【空回滚核心判断】查不到记录代表Try从未成功执行 if(record null){ // 仅标记Cancel成功**不执行业务资源释放逻辑** insertRecord(branchTxId, CANCEL_SUCCESS); return Result.success(); } // 重复Cancel幂等处理直接返回 if(record.getStatus() CANCEL_SUCCESS){ return Result.success(); } // 只有状态是TRY_SUCCESS代表Try成功执行才执行资源释放 if(record.getStatus() TRY_SUCCESS){ releaseFrozenResource(dto); updateStatus(branchTxId, CANCEL_SUCCESS); } return Result.success(); }4Confirm 方法对照参考Transactional public Result confirm(BranchTxDTO dto) { String branchTxId dto.getBranchTxId(); TccRecord record mapper.selectByBranchId(branchTxId); // 仅Try成功的分支允许执行Confirm确认提交 if(record null || record.getStatus() ! TRY_SUCCESS){ return Result.fail(); } confirmBusinessResource(dto); updateStatus(branchTxId, CONFIRM_SUCCESS); return Result.success(); }5这套状态表如何解决两大问题解决空回滚场景Try 没有执行成功TC 下发 Cancel 请求。 Cancel 查询状态表没有找到记录判定 Try 从未成功执行。只写入CANCEL_SUCCESS标记不会执行业务层面的资源释放逻辑避免释放不存在的冻结资源防止脏数据。解决悬挂场景网络延迟Cancel 请求先到达并执行完成状态写入CANCEL_SUCCESS迟到的 Try 请求随后抵达。 Try 查询状态发现已经是 Cancel 成功状态直接拒绝执行资源冻结不会新增冻结记录杜绝资源永久冻结。精简版 空回滚和悬挂是 TCC 网络异常造成 Try、Cancel 请求时序错乱带来的问题。Confirm 执行前提是所有分支 Try 全部成功异常场景下不会走到 Confirm 阶段问题只出在 Try 与 Cancel 之间。 解决方案是引入分支事务状态表以分支事务 ID 作为唯一标识记录执行阶段。 Cancel 查询无记录代表 Try 未执行仅标记 Cancel 成功不释放业务资源解决空回滚 Try 查询到状态已为 Cancel 成功直接拒绝冻结资源解决悬挂同时天然保证 Try、Cancel、Confirm 接口幂等。 状态表读写必须与业务操作在同一个本地事务保证状态与业务数据原子一致。3.4 Seata Saga长流程最终一致性将长事务拆分为一连串独立本地事务每一步同时编写正向业务逻辑和反向补偿逻辑。流程中任意步骤失败则逆向执行补偿逻辑回滚已完成操作。适合订单履约、审批等长链路业务仅能做到最终一致性。Saga 分为两种架构编排式Seata托管、中心调度、协同式MQ事件驱动、无中心工程中Seata Saga默认采用编排式。3.5 其他内部轻量方案本地消息表、RocketMQ事务消息适合简单的内部最终一致性场景。精准边界说明RocketMQ 事务消息核心保证本地事务与消息发送的原子性即本地事务成功则消息必投、失败则不投。但无法保证下游消费成功下游必须通过幂等重试死信队列兜底无法替代Seata多库事务能力。四、核心拔高对外不可控场景第三方/跨公司接口Seata、XA、TCC 属于资源层分布式事务解决多数据库、多中间件的原子性对接外部第三方时无权操作对方数据库、无法要求对方实现补偿逻辑、无法纳入全局事务。此时无任何分布式事务框架可用只能做业务状态一致性补偿这依然属于数据一致性范畴只是不再依靠事务机制而是依靠业务手段保证双方数据最终对齐。这类跨外部系统的方案目标同样是保障业务层面的数据最终一致性但手段和内部可控的分布式事务完全不同。很多人容易产生误区数据一致性就等于分布式事务。实际上分布式事务仅仅是实现数据一致性的一类方案。对接第三方系统场景虽然无法使用标准分布式事务但我们的目标依旧是保障数据一致性只是实现手段换成回调、定时轮询、日终对账这类业务兜底机制最终让双方业务数据状态匹配避免单边成功、单边失败带来资损。跨外部系统行业标准三板斧异步回调 定时轮询 日终对账4.1 异步回调机制我方调用第三方接口时携带我方异步回调HTTP地址。第三方处理完成后主动回调我方接口更新业务状态完成实时闭环。4.2 正向补偿与逆向补偿正向补偿重试业务未完成、结果未知持续重试调用直到成功。第三方对接主流方案无法逆向回滚对方系统。逆向补偿回滚业务已成功执行异常后反向撤销操作TCC-Cancel、Saga补偿仅内部可控系统可用。4.3 定时任务轮询兜底回调存在网络丢包、对方服务异常丢失风险需独立定时任务主动轮询第三方状态接口根据处理中、成功、失败状态流转兜底处理解决中间态数据不一致问题。4.4 日终对账金融级最终兜底每日低峰期与第三方全量流水对账修复单边成功、单边失败等脏数据。金融级精准规范对账差异必须区分「我方多对方少、我方少对方多」两类差异成因与修复逻辑完全不同所有差异必须落地差错处理表禁止直接修改业务表资金类差异需人工审核不允许全自动冲正。五、全链路基石幂等性与状态机所有一致性的前置前提所有分布式一致性方案生效的唯一前提接口必须幂等、流程必须被状态机约束。网络超时、消息重推、请求乱序是分布式常态无幂等会产生重复资损无状态机会导致流程错乱、补偿失控最终一致性彻底失效。5.1 幂等性解决「重复执行」问题核心作用保证同一个请求、任务、消息多次执行最终业务结果与执行一次完全一致杜绝重复扣款、重复下单、重复补偿问题。主流实现方案唯一业务流水号 数据库唯一索引核心兜底固定业务状态机流转禁止状态逆向乱跳Redis临时幂等标记短时高频防重5.2 状态机解决「一致性、乱序、阶段不明」核心问题高频疑问解答状态机到底和数据一致性有什么关系核心本质强一致事务本地事务、XA依靠数据库锁事务日志瞬间完成全资源原子提交无中间状态、无需业务兜底但所有最终一致性方案AT/Saga/事务消息/第三方对接都存在「执行耗时、中间态滞留、结果未知」的窗口期。这个窗口期数据库没有任何机制能自动判断「流程走到哪一步、该不该重试、该不该补偿、该不该拦截」状态机就是分布式最终一致性的业务层事务日志是收敛数据一致的唯一核心依托。状态机保障一致性的三大核心能力1.标记事务阶段杜绝盲目重试/补偿分布式最大痛点接口超时、结果未知。没有状态机程序无法判断流程进度盲目重试会重复执行业务盲目补偿会错误回滚正常数据。状态机通过「初始化→处理中→成功/失败」的状态记录精准判断当前流程节点只执行合法操作保障数据收敛一致。2.拦截消息乱序、杜绝悬挂/空执行解决TCC/Saga核心坑MQ消息、回调请求会出现乱序补偿消息先到、正向消息后到。状态机通过合法流转规则拦截非法操作例如初始状态禁止执行Cancel补偿彻底解决TCC悬挂、空回滚问题避免资源永久冻结或无效补偿保障事务一致性。3.屏蔽中间态、解决AT脏读、统一数据可见性Seata AT一阶段提交会暴露中间脏数据依靠状态机区分「中间态/终态」业务层只查询终态数据屏蔽未完成的事务中间状态从业务视图层面补齐隔离性保障对外数据一致性。5.3 幂等 状态机 精准分工幂等管重复。解决「多次执行会不会产生资损」兜底重复请求、重复消息、重复定时任务。状态机管顺序、阶段、边界。解决「能不能执行、该不该补偿、流程是否合法」兜底乱序、超时、流程错乱。终极结论强一致靠数据库机制最终一致靠「幂等状态机」。没有这两者所有分布式补偿、重试、事务方案都会破防无法实现数据一致性收敛。六、2PC / 3PC 底层理论阻塞与脑裂缺陷工程实战版6.1 2PC 两阶段提交原理与致命缺陷角色分为协调者TC、参与者RM。阶段1 PrepareRM预执行SQL、锁资源、写日志阶段2 Commit/RollbackTC统一下发最终指令。两大核心缺陷工程真实痛点长期阻塞问题RM进入Prepare状态后持有行锁等待TC指令。TC宕机或网络失联时RM既无法提交也无法回滚长期占用锁阻塞业务这是生产中2PC最常见故障。脑裂网络分区所有RM Prepare成功后发生网络分区TC对可达节点执行Commit隔离RM永久卡在Prepare状态全局数据不一致。工程现实补充生产中TC均部署3节点高可用集群脑裂概率极低真正高频风险是RM侧长期锁阻塞也是XA模式不适合高并发的核心原因。6.2 3PC 优化与固有局限新增PreCommit阶段与超时机制彻底解决2PC长期阻塞问题RM超时自动回滚释放资源。但受限于CAP理论无法根治脑裂极端网络分区仍会出现决策不一致。补充Seata XA底层为标准2PC自带阻塞、脑裂缺陷Seata AT无Prepare阶段一阶段直接释放锁无阻塞问题仅存在脏读风险依靠定时重试收敛数据。七、工程选型标准表格极简速查版业务场景最优方案一致性级别性能并发单机单库简单业务本地事务强一致极高内部高并发通用业务低冲突Seata AT最终一致读未提交高低冲突最优内部资金/库存热点交易高冲突Seata TCC业务层强一致高抗热点争抢内部长流程履约/审批Seata Saga最终一致中内部低并发、极致强一致Seata XA数据库层强一致低跨第三方/跨公司对接回调轮询日终对账业务最终一致无锁阻塞八、高频QAQSeata AT 和 TCC 如何选型AT 零侵入、开发成本低适合高并发、数据冲突少的通用互联网业务但存在读未提交的脏读问题且热点行高频更新时TC全局锁、undo_log读写膨胀会成为性能瓶颈。针对脏读问题互联网项目有三种落地方案业务状态机过滤中间态、select for update悲观锁查询核心资金库存场景直接切换TCC。TCC 代码侵入高、需手动处理空回滚、悬挂、幂等三大坑但无底层锁竞争、资源可见性由业务自主控制隔离性与并发稳定性更强专门适配库存、资金等高争抢、高精密核心交易场景。Q为什么 XA 性能差XA 基于标准2PCPrepare 阶段长期持有行锁锁持有时间覆盖整个全局事务生命周期高并发下锁等待严重且 TC 故障会导致大批量 RM 资源永久阻塞严重影响业务可用性因此仅适用于低并发、强一致场景。QMQ 事务消息能否替代 Seata不能。MQ 事务消息解决的是「本地事务与消息投递的原子性」用于业务上下游解耦Seata 解决的是「多数据源、多服务数据库操作的资源层原子性」二者场景、维度完全不同只能互补、无法替代。Q为什么说幂等和状态机是分布式一致性的底层基石因为分布式最终一致性场景无法像本地事务一样瞬间完成原子提交必然存在中间态、超时、乱序、重复执行的问题。幂等负责兜底重复执行避免资损状态机负责约束流程顺序、标记事务阶段、拦截非法操作、屏蔽中间脏态。所有重试、补偿、回调、对账机制都必须依赖二者才能正常收敛最终实现数据一致性。没有幂等和状态机所有分布式事务方案都会失效。九、全文总结1. 事务的最小边界是 Connection单连接本地事务是所有一致性方案的根基工程准则能本地绝不分布式。2. 本地事务仅支持单资源原子性跨多数据源、多服务、异构资源的场景必然需要分布式事务兜底。3.数据一致性是大目标分两种实现路线内部靠分布式事务外部第三方靠业务补偿、对账。4.对内可控系统依托Seata四大模式根据并发冲突率、一致性要求灵活选型低冲突用AT、高热点用TCC、长流程用Saga、低并发强一致用XA。5.对外不可控系统无框架可用依靠正向重试、状态机、回调轮询、金融级对账实现业务层面的数据最终一致性。6. 幂等与状态机是所有分布式一致性的底层基石没有幂等防重、没有状态机控流程所有事务、补偿、重试机制都不成立。7. 分布式一致性无完美方案所有落地实现都是取舍强一致牺牲性能高并发接纳最终一致可控靠框架不可控靠业务。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价