微服务分布式事务:Seata TCC 模式在订单 - 库存服务中的实战应用
·
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. 性能优化建议
- 异步Confirm/Cancel:通过消息队列解耦
- 热点库存拆分:采用库存分桶策略
- TCC超时控制:设置事务超时时间(默认60s)
注:TCC模式适用于中低频交易场景,高频场景建议结合Saga模式。实际部署需配合Seata Server的TC(事务协调器)完成分布式事务调度。
更多推荐
所有评论(0)