微服务分布式事务解决方案技术预研:Saga模式、TCC模式与消息队列最终一致性实现对比分析

D
dashi15 2025-09-05T17:12:45+08:00
0 0 221

引言

随着微服务架构的广泛应用,分布式事务问题成为了企业级应用开发中的核心挑战之一。在单体应用时代,事务管理相对简单,可以借助数据库的ACID特性轻松实现事务的原子性、一致性、隔离性和持久性。然而,当业务被拆分为多个独立的微服务时,跨服务的事务协调变得异常复杂。

传统的两阶段提交(2PC)协议虽然能够保证分布式事务的强一致性,但其阻塞性、性能瓶颈和单点故障等问题使其在高并发、高可用的微服务架构中难以应用。因此,业界提出了多种轻量级的分布式事务解决方案,其中Saga模式、TCC模式和基于消息队列的最终一致性方案成为了主流选择。

本文将深入分析这三种分布式事务解决方案的技术原理、实现机制、优缺点以及适用场景,并结合实际业务需求提供技术选型建议和实施路线图,为企业在微服务架构下的事务管理提供参考。

分布式事务基础理论

CAP定理与BASE理论

在讨论分布式事务解决方案之前,我们需要先理解CAP定理和BASE理论。

CAP定理指出,在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)三者不可兼得,最多只能同时满足其中两个。

BASE理论是CAP定理的延伸,强调基本可用(Basically Available)、软状态(Soft state)和最终一致性(Eventual consistency)。BASE理论为分布式事务提供了更加实用的设计思路。

分布式事务的核心挑战

  1. 原子性保证:确保所有参与的微服务要么全部成功,要么全部失败回滚
  2. 一致性维护:在分布式环境中维护数据的一致性状态
  3. 隔离性控制:防止并发事务之间的相互干扰
  4. 持久性保障:确保已提交的事务结果不会丢失

Saga模式详解

Saga模式基本概念

Saga模式是一种长事务解决方案,将一个长事务拆分为多个短事务,每个短事务都有对应的补偿事务。当某个短事务执行失败时,通过执行之前短事务的补偿事务来实现事务的回滚。

Saga模式有两种实现方式:

  • 事件编排(Event Choreography):参与者之间通过事件进行通信,没有中央协调器
  • 命令编排(Command Orchestration):存在中央协调器来控制事务的执行流程

事件编排Saga实现

事件编排模式下,每个服务在完成自己的业务逻辑后发布事件,其他服务监听相关事件并执行相应的操作。

// 订单服务
@Service
public class OrderService {
    
    @Autowired
    private OrderRepository orderRepository;
    
    @Autowired
    private EventPublisher eventPublisher;
    
    public void createOrder(Order order) {
        // 创建订单
        order.setStatus(OrderStatus.PENDING);
        orderRepository.save(order);
        
        // 发布订单创建事件
        eventPublisher.publish(new OrderCreatedEvent(order.getId(), order.getAmount()));
    }
    
    @EventListener
    public void handlePaymentFailed(PaymentFailedEvent event) {
        // 处理支付失败,更新订单状态
        Order order = orderRepository.findById(event.getOrderId());
        order.setStatus(OrderStatus.FAILED);
        orderRepository.save(order);
    }
}

// 支付服务
@Service
public class PaymentService {
    
    @Autowired
    private PaymentRepository paymentRepository;
    
    @Autowired
    private EventPublisher eventPublisher;
    
    @EventListener
    public void handleOrderCreated(OrderCreatedEvent event) {
        try {
            // 执行支付逻辑
            Payment payment = new Payment();
            payment.setOrderId(event.getOrderId());
            payment.setAmount(event.getAmount());
            payment.setStatus(PaymentStatus.PROCESSING);
            paymentRepository.save(payment);
            
            // 模拟支付处理
            boolean success = processPayment(payment);
            
            if (success) {
                payment.setStatus(PaymentStatus.SUCCESS);
                paymentRepository.save(payment);
                // 发布支付成功事件
                eventPublisher.publish(new PaymentSuccessEvent(event.getOrderId()));
            } else {
                payment.setStatus(PaymentStatus.FAILED);
                paymentRepository.save(payment);
                // 发布支付失败事件
                eventPublisher.publish(new PaymentFailedEvent(event.getOrderId()));
            }
        } catch (Exception e) {
            // 发布支付失败事件
            eventPublisher.publish(new PaymentFailedEvent(event.getOrderId()));
        }
    }
    
    private boolean processPayment(Payment payment) {
        // 实际的支付处理逻辑
        return true; // 简化示例
    }
}

命令编排Saga实现

命令编排模式使用Saga协调器来控制整个事务的执行流程。

// Saga协调器
@Component
public class OrderSagaOrchestrator {
    
    @Autowired
    private OrderServiceClient orderServiceClient;
    
    @Autowired
    private PaymentServiceClient paymentServiceClient;
    
    @Autowired
    private InventoryServiceClient inventoryServiceClient;
    
    public void executeOrderSaga(String orderId) {
        SagaContext context = new SagaContext(orderId);
        
        try {
            // 步骤1:预留库存
            context.setInventoryReserved(inventoryServiceClient.reserveInventory(orderId));
            
            // 步骤2:创建订单
            context.setOrderCreated(orderServiceClient.createOrder(orderId));
            
            // 步骤3:执行支付
            context.setPaymentProcessed(paymentServiceClient.processPayment(orderId));
            
            // 所有步骤成功,提交事务
            commitSaga(context);
            
        } catch (Exception e) {
            // 发生异常,回滚事务
            rollbackSaga(context);
            throw new SagaExecutionException("Saga execution failed", e);
        }
    }
    
    private void commitSaga(SagaContext context) {
        // 提交事务
        orderServiceClient.confirmOrder(context.getOrderId());
        paymentServiceClient.confirmPayment(context.getOrderId());
        inventoryServiceClient.confirmInventory(context.getOrderId());
    }
    
    private void rollbackSaga(SagaContext context) {
        // 回滚事务
        if (context.isPaymentProcessed()) {
            paymentServiceClient.cancelPayment(context.getOrderId());
        }
        if (context.isOrderCreated()) {
            orderServiceClient.cancelOrder(context.getOrderId());
        }
        if (context.isInventoryReserved()) {
            inventoryServiceClient.releaseInventory(context.getOrderId());
        }
    }
}

// Saga上下文
@Data
public class SagaContext {
    private String orderId;
    private boolean inventoryReserved;
    private boolean orderCreated;
    private boolean paymentProcessed;
    
    public SagaContext(String orderId) {
        this.orderId = orderId;
    }
}

Saga模式优缺点分析

优点:

  • 实现相对简单,易于理解和维护
  • 支持长事务处理
  • 具有较好的可扩展性
  • 适用于业务流程复杂的场景

缺点:

  • 需要为每个操作设计补偿逻辑
  • 数据一致性是最终一致性,不是强一致性
  • 补偿逻辑的实现可能比较复杂
  • 调试和监控相对困难

TCC模式详解

TCC模式基本概念

TCC(Try-Confirm-Cancel)模式是一种业务层面的分布式事务解决方案,要求每个参与者都实现三个操作:

  • Try:预留业务资源
  • Confirm:确认执行业务操作
  • Cancel:取消执行,释放预留资源

TCC模式实现

// TCC接口定义
public interface TccAction {
    /**
     * Try阶段:预留资源
     */
    boolean prepare(BusinessActionContext actionContext);
    
    /**
     * Confirm阶段:确认执行
     */
    boolean commit(BusinessActionContext actionContext);
    
    /**
     * Cancel阶段:取消执行
     */
    boolean rollback(BusinessActionContext actionContext);
}

// 账户服务TCC实现
@Service
public class AccountTccAction implements TccAction {
    
    @Autowired
    private AccountRepository accountRepository;
    
    @Override
    @Transactional
    public boolean prepare(BusinessActionContext actionContext) {
        String accountId = (String) actionContext.getActionContext("accountId");
        BigDecimal amount = (BigDecimal) actionContext.getActionContext("amount");
        
        Account account = accountRepository.findById(accountId);
        if (account.getBalance().compareTo(amount) < 0) {
            return false; // 余额不足
        }
        
        // 预留资金
        account.setFrozenAmount(account.getFrozenAmount().add(amount));
        account.setBalance(account.getBalance().subtract(amount));
        accountRepository.save(account);
        
        return true;
    }
    
    @Override
    @Transactional
    public boolean commit(BusinessActionContext actionContext) {
        String accountId = (String) actionContext.getActionContext("accountId");
        BigDecimal amount = (BigDecimal) actionContext.getActionContext("amount");
        
        Account account = accountRepository.findById(accountId);
        // 确认扣款
        account.setFrozenAmount(account.getFrozenAmount().subtract(amount));
        accountRepository.save(account);
        
        return true;
    }
    
    @Override
    @Transactional
    public boolean rollback(BusinessActionContext actionContext) {
        String accountId = (String) actionContext.getActionContext("accountId");
        BigDecimal amount = (BigDecimal) actionContext.getActionContext("amount");
        
        Account account = accountRepository.findById(accountId);
        // 释放冻结资金
        account.setFrozenAmount(account.getFrozenAmount().subtract(amount));
        account.setBalance(account.getBalance().add(amount));
        accountRepository.save(account);
        
        return true;
    }
}

// 转账服务
@Service
public class TransferService {
    
    @Autowired
    private TccTransactionManager transactionManager;
    
    public boolean transfer(String fromAccountId, String toAccountId, BigDecimal amount) {
        try {
            // 开启TCC事务
            transactionManager.begin();
            
            // 从账户扣款
            BusinessActionContext fromContext = new BusinessActionContext();
            fromContext.setActionContext("accountId", fromAccountId);
            fromContext.setActionContext("amount", amount);
            transactionManager.registerParticipant("accountTccAction", fromContext);
            
            // 向账户充值
            BusinessActionContext toContext = new BusinessActionContext();
            toContext.setActionContext("accountId", toAccountId);
            toContext.setActionContext("amount", amount);
            transactionManager.registerParticipant("accountTccAction", toContext);
            
            // 提交事务
            transactionManager.commit();
            return true;
            
        } catch (Exception e) {
            // 回滚事务
            transactionManager.rollback();
            return false;
        }
    }
}

TCC事务管理器实现

@Component
public class TccTransactionManager {
    
    private ThreadLocal<TccTransaction> currentTransaction = new ThreadLocal<>();
    
    @Autowired
    private TccTransactionRepository transactionRepository;
    
    public void begin() {
        TccTransaction transaction = new TccTransaction();
        transaction.setStatus(TransactionStatus.TRYING);
        transaction.setBeginTime(new Date());
        transactionRepository.save(transaction);
        currentTransaction.set(transaction);
    }
    
    public void registerParticipant(String actionBeanName, BusinessActionContext context) {
        TccTransaction transaction = currentTransaction.get();
        if (transaction == null) {
            throw new IllegalStateException("No active transaction");
        }
        
        Participant participant = new Participant();
        participant.setActionName(actionBeanName);
        participant.setContext(context);
        transaction.addParticipant(participant);
        
        // 执行Try操作
        TccAction action = getTccAction(actionBeanName);
        boolean result = action.prepare(context);
        if (!result) {
            throw new TccTryException("Try operation failed for " + actionBeanName);
        }
    }
    
    public void commit() {
        TccTransaction transaction = currentTransaction.get();
        if (transaction == null) {
            throw new IllegalStateException("No active transaction");
        }
        
        try {
            // 执行所有参与者的Confirm操作
            for (Participant participant : transaction.getParticipants()) {
                TccAction action = getTccAction(participant.getActionName());
                boolean result = action.commit(participant.getContext());
                if (!result) {
                    throw new TccConfirmException("Confirm operation failed for " + participant.getActionName());
                }
            }
            
            transaction.setStatus(TransactionStatus.CONFIRMED);
            transaction.setEndTime(new Date());
            transactionRepository.save(transaction);
            
        } catch (Exception e) {
            // 如果Confirm失败,需要进行补偿
            rollback();
            throw e;
        } finally {
            currentTransaction.remove();
        }
    }
    
    public void rollback() {
        TccTransaction transaction = currentTransaction.get();
        if (transaction == null) {
            throw new IllegalStateException("No active transaction");
        }
        
        // 执行所有参与者的Cancel操作(逆序执行)
        List<Participant> participants = transaction.getParticipants();
        for (int i = participants.size() - 1; i >= 0; i--) {
            Participant participant = participants.get(i);
            try {
                TccAction action = getTccAction(participant.getActionName());
                action.rollback(participant.getContext());
            } catch (Exception e) {
                // 记录日志,但不中断回滚过程
                log.error("Cancel operation failed for " + participant.getActionName(), e);
            }
        }
        
        transaction.setStatus(TransactionStatus.CANCELLED);
        transaction.setEndTime(new Date());
        transactionRepository.save(transaction);
        currentTransaction.remove();
    }
    
    private TccAction getTccAction(String actionBeanName) {
        return (TccAction) applicationContext.getBean(actionBeanName);
    }
}

TCC模式优缺点分析

优点:

  • 实现强一致性
  • 业务侵入性相对较小
  • 性能较好,资源锁定时间短
  • 支持高并发场景

缺点:

  • 需要业务方实现Try、Confirm、Cancel三个接口
  • 业务逻辑复杂度增加
  • 需要处理各种异常情况
  • 对业务方的开发要求较高

消息队列最终一致性实现

基本原理

基于消息队列的最终一致性方案通过消息中间件来协调分布式事务,确保各参与方最终达到一致状态。常见的实现方式包括本地消息表、事务消息等。

本地消息表实现

// 订单服务
@Service
public class OrderService {
    
    @Autowired
    private OrderRepository orderRepository;
    
    @Autowired
    private MessageRepository messageRepository;
    
    @Autowired
    private MessageProducer messageProducer;
    
    @Transactional
    public void createOrder(Order order) {
        // 1. 创建订单
        order.setStatus(OrderStatus.CREATED);
        orderRepository.save(order);
        
        // 2. 创建消息记录
        Message message = new Message();
        message.setBizId(order.getId());
        message.setBizType("ORDER_CREATED");
        message.setContent(JSON.toJSONString(order));
        message.setStatus(MessageStatus.PENDING);
        message.setCreateTime(new Date());
        messageRepository.save(message);
        
        // 3. 发送消息
        messageProducer.send("order.created", message.getContent());
        message.setStatus(MessageStatus.SENT);
        messageRepository.save(message);
    }
    
    @Transactional
    @RabbitListener(queues = "payment.processed")
    public void handlePaymentProcessed(String messageContent) {
        PaymentResult result = JSON.parseObject(messageContent, PaymentResult.class);
        
        Order order = orderRepository.findById(result.getOrderId());
        if (result.isSuccess()) {
            order.setStatus(OrderStatus.PAID);
        } else {
            order.setStatus(OrderStatus.PAYMENT_FAILED);
        }
        orderRepository.save(order);
    }
}

// 消息表实体
@Entity
@Table(name = "t_message")
@Data
public class Message {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String bizId;           // 业务ID
    private String bizType;         // 业务类型
    private String content;         // 消息内容
    private String status;          // 消息状态:PENDING, SENT, PROCESSED
    private Date createTime;        // 创建时间
    private Date updateTime;        // 更新时间
    private Integer retryCount;     // 重试次数
}

// 消息发送服务
@Service
public class MessageProducer {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void send(String routingKey, String message) {
        try {
            rabbitTemplate.convertAndSend("exchangeName", routingKey, message);
        } catch (Exception e) {
            // 记录发送失败,后续通过定时任务重试
            throw new MessageSendException("Failed to send message", e);
        }
    }
}

// 消息重试服务
@Component
public class MessageRetryService {
    
    @Autowired
    private MessageRepository messageRepository;
    
    @Autowired
    private MessageProducer messageProducer;
    
    @Scheduled(fixedDelay = 60000) // 每分钟执行一次
    public void retryPendingMessages() {
        List<Message> pendingMessages = messageRepository.findByStatusAndRetryCountLessThan(
            MessageStatus.PENDING, 3);
        
        for (Message message : pendingMessages) {
            try {
                messageProducer.send("order.created", message.getContent());
                message.setStatus(MessageStatus.SENT);
                message.setRetryCount(message.getRetryCount() + 1);
                messageRepository.save(message);
            } catch (Exception e) {
                message.setRetryCount(message.getRetryCount() + 1);
                messageRepository.save(message);
                log.error("Failed to retry send message: " + message.getId(), e);
            }
        }
    }
}

RocketMQ事务消息实现

// 使用RocketMQ事务消息
@Component
public class TransactionMessageService {
    
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    
    @Autowired
    private OrderRepository orderRepository;
    
    public void sendTransactionMessage(Order order) {
        // 发送半消息
        TransactionSendResult result = rocketMQTemplate.sendMessageInTransaction(
            "order-topic", 
            MessageBuilder.withPayload(order).build(), 
            order);
        
        if (result.getLocalTransactionState() == LocalTransactionState.UNKNOW) {
            // 本地事务状态未知,需要回查
            log.warn("Local transaction state is unknown for order: " + order.getId());
        }
    }
    
    /**
     * 本地事务执行器
     */
    @RocketMQTransactionListener
    public class OrderTransactionListener implements RocketMQLocalTransactionListener {
        
        @Override
        public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
            try {
                Order order = (Order) arg;
                
                // 执行本地事务:创建订单
                order.setStatus(OrderStatus.CREATED);
                orderRepository.save(order);
                
                // 根据业务逻辑决定事务状态
                return LocalTransactionState.COMMIT;
                
            } catch (Exception e) {
                log.error("Execute local transaction failed", e);
                return LocalTransactionState.ROLLBACK;
            }
        }
        
        @Override
        public LocalTransactionState checkLocalTransaction(MessageExt msg) {
            // 回查本地事务状态
            String orderId = JSON.parseObject(new String(msg.getBody()), Order.class).getId();
            Order order = orderRepository.findById(orderId);
            
            if (order != null && order.getStatus() == OrderStatus.CREATED) {
                return LocalTransactionState.COMMIT;
            } else {
                return LocalTransactionState.ROLLBACK;
            }
        }
    }
}

消息队列方案优缺点分析

优点:

  • 实现相对简单
  • 解耦性好,各服务独立性强
  • 支持异步处理,性能较好
  • 可靠性高,有消息持久化保障

缺点:

  • 只能保证最终一致性
  • 消息可能重复投递,需要幂等性处理
  • 调试和监控相对复杂
  • 需要处理消息积压问题

三种方案对比分析

技术特性对比

特性 Saga模式 TCC模式 消息队列
一致性级别 最终一致性 强一致性 最终一致性
实现复杂度 中等 中等
业务侵入性 中等
性能表现 中等
容错能力 中等
调试难度 中等

适用场景分析

Saga模式适用场景

  • 业务流程复杂,涉及多个服务
  • 可以接受最终一致性
  • 需要支持长事务处理
  • 业务逻辑变更频繁的场景

TCC模式适用场景

  • 对数据一致性要求极高
  • 业务逻辑相对稳定
  • 高并发、高性能要求
  • 资源锁定时间需要最小化

消息队列适用场景

  • 服务间解耦要求高
  • 异步处理需求强烈
  • 系统可靠性要求高
  • 可以接受最终一致性延迟

实际应用案例

电商订单处理场景

以电商订单处理为例,涉及用户下单、库存扣减、支付处理、物流通知等多个服务。

使用Saga模式实现

@Component
public class OrderProcessingSaga {
    
    @Autowired
    private OrderService orderService;
    
    @Autowired
    private InventoryService inventoryService;
    
    @Autowired
    private PaymentService paymentService;
    
    @Autowired
    private LogisticsService logisticsService;
    
    public void processOrder(String orderId) {
        SagaContext context = new SagaContext(orderId);
        
        try {
            // 步骤1:创建订单
            orderService.createOrder(orderId);
            context.setOrderCreated(true);
            
            // 步骤2:预留库存
            inventoryService.reserveInventory(orderId);
            context.setInventoryReserved(true);
            
            // 步骤3:处理支付
            paymentService.processPayment(orderId);
            context.setPaymentProcessed(true);
            
            // 步骤4:通知物流
            logisticsService.notifyShipment(orderId);
            context.setLogisticsNotified(true);
            
            // 全部成功
            log.info("Order processing completed successfully: " + orderId);
            
        } catch (Exception e) {
            log.error("Order processing failed, rolling back: " + orderId, e);
            rollback(context);
            throw new OrderProcessingException("Order processing failed", e);
        }
    }
    
    private void rollback(SagaContext context) {
        String orderId = context.getOrderId();
        
        // 逆序执行补偿操作
        if (context.isLogisticsNotified()) {
            logisticsService.cancelShipment(orderId);
        }
        
        if (context.isPaymentProcessed()) {
            paymentService.refund(orderId);
        }
        
        if (context.isInventoryReserved()) {
            inventoryService.releaseInventory(orderId);
        }
        
        if (context.isOrderCreated()) {
            orderService.cancelOrder(orderId);
        }
    }
}

使用TCC模式实现

@Service
public class OrderTccService {
    
    @Autowired
    private TccTransactionManager transactionManager;
    
    public boolean processOrder(OrderRequest request) {
        try {
            transactionManager.begin();
            
            // 注册库存预留参与者
            BusinessActionContext inventoryContext = new BusinessActionContext();
            inventoryContext.setActionContext("productId", request.getProductId());
            inventoryContext.setActionContext("quantity", request.getQuantity());
            transactionManager.registerParticipant("inventoryTccAction", inventoryContext);
            
            // 注册支付处理参与者
            BusinessActionContext paymentContext = new BusinessActionContext();
            paymentContext.setActionContext("userId", request.getUserId());
            paymentContext.setActionContext("amount", request.getAmount());
            transactionManager.registerParticipant("paymentTccAction", paymentContext);
            
            // 提交事务
            transactionManager.commit();
            return true;
            
        } catch (Exception e) {
            log.error("Order TCC transaction failed", e);
            transactionManager.rollback();
            return false;
        }
    }
}

技术选型建议

选型决策因素

  1. 一致性要求:如果业务要求强一致性,优先考虑TCC模式;如果可以接受最终一致性,Saga模式和消息队列都是不错的选择。

  2. 业务复杂度:业务流程简单的场景,TCC模式实现相对容易;业务流程复杂的场景,Saga模式更加适合。

  3. 性能要求:对性能要求极高的场景,TCC模式由于资源锁定时间短,性能表现最佳。

  4. 开发成本:消息队列方案对业务侵入性最小,开发成本相对较低。

  5. 运维复杂度:Saga模式和消息队列方案的运维相对简单,TCC模式需要更多的监控和维护。

推荐选型方案

业务场景 推荐方案 理由
金融交易 TCC模式 强一致性要求,资金安全第一
电商订单 Saga模式 业务流程复杂,可接受最终一致性
异步通知 消息队列 解耦性强,异步处理需求
数据同步 消息队列 可靠性要求高,批量处理
库存管理 TCC模式 实时性要求高,避免超卖

实施路线图

第一阶段:技术预研与验证(1-2个月)

  1. 技术调研:深入研究Saga、TCC、消息队列三种方案的技术细节
  2. 原型开发:针对典型业务场景开发技术原型
  3. 性能测试:对比分析三种方案的性能表现
  4. 风险评估:识别各方案的潜在风险和挑战

第二阶段:方案选型与架构设计(1个月)

  1. 业务分析:梳理现有业务场景的事务需求
  2. 方案选型:根据不同业务场景选择合适的方案
  3. 架构设计:设计分布式事务的整体架构
  4. 技术规范:制定开发规范和最佳实践

第三阶段:试点实施与优化(2-3个月)

  1. 试点选择:选择合适的业务模块进行试点
  2. 代码实现:按照设计方案实现分布式事务
  3. 测试验证:进行全面的功能和性能测试
  4. 问题优化:根据测试结果优化实现方案

第四阶段:全面推广与运维(持续进行)

  1. 培训推广:对开发团队进行技术培训
  2. 监控告警:建立完善的监控和告警机制
  3. 持续优化:根据运行情况持续优化方案
  4. 文档完善:完善技术文档和操作手册

最佳实践建议

通用最佳实践

  1. 幂等性设计:确保所有操作都具有幂等性,避免重复执行导致的问题
  2. 异常处理:完善的异常处理机制,确保系统在异常情况下能够正确回滚
  3. 监控告警:建立完善的监控体系,及时发现和处理问题
  4. 日志记录:详细的日志记录,便于问题排查和审计
  5. 超时控制:合理的超时设置,避免长时间等待

Saga模式最佳实践

  1. 补偿逻辑设计:补偿操作应该尽可能简单,避免复杂的业务逻辑
  2. 状态管理:完善的状态管理机制,确保能够准确追踪事务状态
  3. 重试机制:合理的重试机制,处理临时性故障
  4. 并发控制:适当的并发控制,避免资源竞争

TCC模式最佳实践

  1. 资源预留:Try阶段的资源预留要合理,避免过度锁定
  2. 超时处理:合理的超时设置

相似文章

    评论 (0)