1.Seata-TCC-银行转账场景

293 阅读5分钟

在分布式系统中,银行转账使用 TCC(Try-Confirm-Cancel) 模式时,涉及到多个服务的协作。每个服务需要对其相关资源进行事务管理,以确保转账的一致性与可靠性。不同服务之间的数据结构和表设计至关重要,尤其是如何记录每个阶段的状态、事务的关联等。

以下是银行转账中涉及的 TCC 模式下,不同服务的表结构设计,假设有以下服务:

  1. 账户服务:负责账户资金的冻结、解冻、扣款和恢复。
  2. 支付服务:负责资金的实际转账操作。
  3. 通知服务:负责通知用户转账结果。

1. 账户服务:冻结与解冻账户资金

账户服务的核心功能是管理账户的资金状态,尤其是在 Try 阶段冻结资金,在 Confirm 阶段扣款,在 Cancel 阶段解冻资金。

表结构设计:account_transactions

字段名类型描述
transaction_idVARCHAR(64)事务ID,唯一标识一次银行转账事务
account_idVARCHAR(64)账户ID,标识该资金归属于哪个账户
amountDECIMAL(20,2)事务金额,表示冻结或扣除的金额
statusENUM事务状态(PENDINGCOMMITTEDCANCELLED
freeze_statusBOOLEAN冻结状态,标识是否已冻结资金
created_atTIMESTAMP创建时间,标记事务的初始时间
updated_atTIMESTAMP更新时间,标记事务状态变更的时间
service_nameVARCHAR(64)服务名称,标记是哪个服务在处理此操作(如支付服务等)
actionENUM当前操作类型(TRYCONFIRMCANCEL
  • Try 阶段:在账户服务中,当请求冻结资金时,会插入一条记录,并将状态设置为 PENDING,并且 freeze_status 设置为 TRUE,表示资金已被冻结。
  • Confirm 阶段:如果转账成功,账户服务会将 status 更新为 COMMITTED,表示资金已经成功扣除。
  • Cancel 阶段:如果转账失败,账户服务将 status 更新为 CANCELLED,并解冻资金,freeze_status 更新为 FALSE

示例记录:

TRANSACTION_IDACCOUNT_IDAMOUNTSTATUSFREEZE_STATUSCREATED_ATUPDATED_ATSERVICE_NAMEACTION
txn_123456acc_0011000.00PENDINGTRUE2024-12-02 10:00:002024-12-02 10:10:00PaymentTRY
txn_123456acc_0011000.00COMMITTEDTRUE2024-12-02 10:00:002024-12-02 10:30:00PaymentCONFIRM

2. 支付服务:处理资金转账操作

支付服务的核心任务是执行资金的实际转账操作,它需要协调多个服务之间的事务,确保资金的流动。支付服务需要记录每笔转账的 TryConfirmCancel 阶段的执行情况。

表结构设计:payment_transactions

字段名类型描述
transaction_idVARCHAR(64)事务ID,唯一标识一次银行转账事务
from_account_idVARCHAR(64)付款账户ID,标识资金来源账户
to_account_idVARCHAR(64)收款账户ID,标识资金目标账户
amountDECIMAL(20,2)转账金额
statusENUM事务状态(PENDINGCOMMITTEDCANCELLED
created_atTIMESTAMP创建时间
updated_atTIMESTAMP更新时间
actionENUM当前操作类型(TRYCONFIRMCANCEL
payment_methodVARCHAR(64)支付方式(如银行转账、信用卡等)
  • Try 阶段:支付服务记录转账的初始请求,将状态设置为 PENDING,并执行转账验证操作。
  • Confirm 阶段:在资金冻结确认后,支付服务完成实际的资金转移,将状态设置为 COMMITTED
  • Cancel 阶段:在转账过程中出现异常时,支付服务会将状态更新为 CANCELLED,并撤销相关操作。

示例记录:

TRANSACTION_IDFROM_ACCOUNT_IDTO_ACCOUNT_IDAMOUNTSTATUSCREATED_ATUPDATED_ATACTION
txn_123456acc_001acc_0021000.00PENDING2024-12-02 10:00:002024-12-02 10:10:00TRY
txn_123456acc_001acc_0021000.00COMMITTED2024-12-02 10:00:002024-12-02 10:30:00CONFIRM

3. 通知服务:发送转账通知

通知服务的职责是根据转账的不同状态(成功、失败等),向用户发送相应的通知。

表结构设计:notifications

字段名类型描述
notification_idVARCHAR(64)通知ID,唯一标识一次通知
transaction_idVARCHAR(64)事务ID,关联支付事务
user_idVARCHAR(64)用户ID,标识哪个用户需要接收通知
messageTEXT通知内容,描述转账成功或失败的情况
statusENUM通知状态(SENTFAILED
created_atTIMESTAMP创建时间
updated_atTIMESTAMP更新时间
  • Try 阶段:通知服务一般不会在 Try 阶段介入,但可以根据情况发送预通知。
  • Confirm 阶段:当转账完成时,通知服务会向用户发送成功通知,statusSENT
  • Cancel 阶段:如果转账取消,通知服务会向用户发送失败通知,statusFAILED

示例记录:

NOTIFICATION_IDTRANSACTION_IDUSER_IDMESSAGESTATUSCREATED_ATUPDATED_AT
notif_123456txn_123456user_001"转账成功,已完成1000元支付"SENT2024-12-02 10:30:002024-12-02 10:30:00
notif_123457txn_123456user_001"转账失败,1000元支付未完成"FAILED2024-12-02 10:30:002024-12-02 10:30:00

总结

在银行转账过程中使用 TCC 模式时,各个服务(账户服务、支付服务和通知服务)都需要设计相应的表结构来记录事务状态、操作类型(TRYCONFIRMCANCEL)以及资源的冻结、解冻、扣款等操作。通过这些表结构,系统能够在分布式环境下保持数据一致性,并确保跨服务的事务协调。