Seata TCC模式通过业务逻辑拆分实现分布式事务,在订单-库存场景中能有效保证最终一致性。以下是实战设计要点及代码示例:


1. 核心阶段设计

阶段 订单服务 库存服务
Try 创建订单状态为TRYING,冻结用户余额 预扣库存(locked_stock = stock - 1
Confirm 更新订单状态为CONFIRMED 实际扣减库存(stock = locked_stock
Cancel 释放冻结的余额,订单状态CANCELED 恢复预扣库存(locked_stock = null

2. 关键实现代码

订单服务接口
class OrderService:
    @TCC
    def create_order_try(self, user_id, amount):
        # 冻结用户余额
        update_account(f"UPDATE account SET frozen = frozen + {amount} WHERE user_id={user_id}")
        insert_order(f"INSERT INTO orders (status) VALUES ('TRYING')")

    @TCC(confirm_method="confirm_order", cancel_method="cancel_order")
    def create_order_confirm(self, order_id):
        # 实际扣款
        update_account(f"UPDATE account SET balance = balance - frozen, frozen=0 WHERE order_id={order_id}")
        update_order(f"UPDATE orders SET status='CONFIRMED' WHERE id={order_id}")

    def create_order_cancel(self, order_id):
        # 释放冻结金额
        update_account(f"UPDATE account SET frozen=0 WHERE order_id={order_id}")
        update_order(f"UPDATE orders SET status='CANCELED' WHERE id={order_id}")

库存服务接口
class StockService:
    @TCC
    def deduct_stock_try(self, item_id):
        # 预扣库存(生成锁定记录)
        insert_lock(f"INSERT INTO stock_lock (item_id, quantity) VALUES ({item_id}, 1)")
        update_stock(f"UPDATE stock SET locked = locked + 1 WHERE item_id={item_id}")

    @TCC(confirm_method="confirm_deduct", cancel_method="cancel_deduct")
    def deduct_stock_confirm(self, lock_id):
        # 实际扣减库存
        execute(f"""
            UPDATE stock s 
            SET total = total - 1, 
                locked = locked - 1 
            WHERE s.item_id = (
                SELECT item_id FROM stock_lock WHERE id={lock_id}
            )
        """)
        delete_lock(f"DELETE FROM stock_lock WHERE id={lock_id}")

    def deduct_stock_cancel(self, lock_id):
        # 释放锁定库存
        update_stock(f"""
            UPDATE stock SET locked = locked - 1 
            WHERE item_id = (SELECT item_id FROM stock_lock WHERE id={lock_id})
        """)
        delete_lock(f"DELETE FROM stock_lock WHERE id={lock_id}")


3. 异常处理机制

  • 空回滚防护:在Try未执行时收到Cancel,需记录事务日志避免误操作
  • 幂等控制:通过事务状态表(如tx_status)确保Confirm/Cancel只执行一次
  • 悬挂问题:Check阶段验证Try是否超时未执行

4. Seata配置要点

seata:
  service:
    vgroup-mapping: default-seata-group
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
  registry:
    type: nacos


5. 事务执行流程

sequenceDiagram
    Client->>OrderService: 创建订单请求
    OrderService->>Seata Server: 开启全局事务(XID=123)
    OrderService->>StockService: deduct_stock_try(XID=123)
    StockService-->>OrderService: Try成功
    OrderService->>Seata Server: 提交事务
    Seata Server->>StockService: deduct_stock_confirm(XID=123)
    Seata Server->>OrderService: create_order_confirm(XID=123)


6. 性能优化建议

  1. 异步Confirm/Cancel:通过消息队列解耦
  2. 热点库存拆分:采用库存分桶策略
  3. TCC超时控制:设置事务超时时间(默认60s)

:TCC模式适用于中低频交易场景,高频场景建议结合Saga模式。实际部署需配合Seata Server的TC(事务协调器)完成分布式事务调度。

更多推荐