SAGA 长事务补偿模式

FreeGuideOnline 11阅读 2026-07-12

function processOrder(orderDetails): try: T1: orderId = orderService.createOrder(orderDetails) // 创建订单 saveState(“ORDER_CREATED”, orderId)

    T2: inventoryService.reserveStock(orderDetails)       // 扣库存
    saveState(“STOCK_RESERVED”, orderId)
    
    T3: paymentService.debit(orderDetails)                // 扣款
    saveState(“PAYMENT_DEBITED”, orderId)
    
    // 所有步骤成功
    orderService.markCompleted(orderId)
catch error at step k:
    runCompensation(orderId, lastSuccessfulStep)

function runCompensation(orderId, step): switch step: case “PAYMENT_DEBITED”: paymentService.refund(orderId) // 退款 case “STOCK_RESERVED”: inventoryService.releaseStock(orderId) // 恢复库存 case “ORDER_CREATED”: orderService.cancelOrder(orderId) // 取消订单