閉(Close Account)實操指南:結(jié)賬分錄、平衡轉(zhuǎn)賬與可逆重開)
TigerBeetle 賬戶關(guān)閉Close Account實操指南結(jié)賬分錄、平衡轉(zhuǎn)賬與可逆重開【免費下載鏈接】tigerbeetleThe financial transactions database designed for mission critical safety and performance.項目地址: https://gitcode.com/GitHub_Trending/ti/tigerbeetle導(dǎo)讀在金融系統(tǒng)中會計期末結(jié)賬、賬戶終止或?qū)徲媰鼋Y(jié)都要求把賬戶凈余額清零并禁止后續(xù)交易。TigerBeetle 通過平衡轉(zhuǎn)賬 掛起結(jié)賬轉(zhuǎn)賬的組合用兩條原子化的關(guān)聯(lián)轉(zhuǎn)賬即可完成賬戶關(guān)閉且無需應(yīng)用端預(yù)知賬戶余額關(guān)閉動作本身也是可逆的——只需撤銷void對應(yīng)的掛起結(jié)賬轉(zhuǎn)賬即可重新打開賬戶。讀完本文你將掌握balancing_debit/balancing_credit、closing_debit/closing_credit、linked與pending等標(biāo)志的組合用法以及如何利用AMOUNT_MAX讓數(shù)據(jù)庫自動計算實際轉(zhuǎn)賬金額。會計背景什么是結(jié)賬分錄Closing Entry在會計學(xué)中結(jié)賬分錄closing entry首先計算一個賬戶的凈借方或凈貸方余額然后分別貸記或借記該余額使賬戶余額歸零并把余額轉(zhuǎn)移到另一個賬戶如控制賬戶/總賬賬戶。TigerBeetle 在賬戶層面提供Account.flags.closed標(biāo)志位用于禁止該賬戶上發(fā)生進(jìn)一步的轉(zhuǎn)賬——這適用于會計期末結(jié)賬、賬戶終止甚至出于審計目的臨時凍結(jié)賬戶。值得注意的是關(guān)閉賬戶不影響已有的掛起轉(zhuǎn)賬這些掛起轉(zhuǎn)賬仍然可以超時timeout自動失效但不能被 posted 或 voided。關(guān)于該標(biāo)志的完整語義可參考 Account.flags.closed。TigerBeetle 賬戶與轉(zhuǎn)賬都不可刪除見 Account Deletion因此關(guān)閉賬戶而非刪除賬戶是官方推薦的清理不再使用賬戶的方式。關(guān)閉賬戶的前提余額約束標(biāo)志關(guān)閉賬戶的可行方案依賴賬戶上的余額約束標(biāo)志。被關(guān)閉的賬戶必須帶有以下兩個互斥標(biāo)志之一定義見 Account flagsdebits_must_not_exceed_credits當(dāng)debits_pending debits_posted transfer.amount credits_posted時該賬戶的轉(zhuǎn)賬會被拒絕credits_must_not_exceed_debits當(dāng)credits_pending credits_posted transfer.amount debits_posted時該賬戶的轉(zhuǎn)賬會被拒絕。這兩個標(biāo)志無法同時設(shè)置。正是由于賬戶被約束為借方不得超過貸方或反之系統(tǒng)才得以確定一個明確的凈余額方向從而支持下面的平衡轉(zhuǎn)賬自動計算。說明上述約束在 src/state_machine.zig 中與平衡金額計算邏輯聯(lián)動。以balancing_debit為例源碼在提交轉(zhuǎn)賬時計算amount min(amount, credits_posted - (debits_posted debits_pending))見 src/state_machine.zig即自動把轉(zhuǎn)賬金額限制在賬戶約束允許的最大值內(nèi)——這正是無需應(yīng)用端查詢余額的底層原理。完整示例關(guān)閉兩個賬戶初始賬戶狀態(tài)給定一組賬戶AccountDebits PendingDebits PostedCredits PendingCredits PostedFlagsA010020debits_must_not_exceed_creditsB03005credits_must_not_exceed_debitsC0000賬戶A凈余額為貸方 10credits_posted(20) ? debits_posted(10)受貸方不得超支反向約束賬戶B凈余額為借方 25debits_posted(30) ? credits_posted(5)賬戶C作為控制賬戶control account接收歸零后的余額自身不會被關(guān)閉。結(jié)賬轉(zhuǎn)賬設(shè)計賬戶A和B的結(jié)賬分錄分別表示為關(guān)聯(lián)鏈linked chains因此它們要么全部成功要么全部失敗原子性。鏈接事件機制詳見 linked-events。賬戶A關(guān)聯(lián)轉(zhuǎn)賬為T1和T2賬戶B關(guān)聯(lián)轉(zhuǎn)賬為T3和T4賬戶C控制賬戶不關(guān)閉。TransferDebit AccountCredit AccountAmountAmount (recorded)FlagsT1ACAMOUNT_MAX10balancing_debit,linkedT2AC00closing_debit,pendingT3CBAMOUNT_MAX25balancing_credit,linkedT4CB00closing_credit,pending兩個關(guān)鍵設(shè)計點T1與T3是平衡轉(zhuǎn)賬balancing transfersTransfer.amount填A(yù)MOUNT_MAX2^128 ? 1各客戶端 SDK 中可直接使用常量如 Java 的TransferBatch.AMOUNT_MAX、Python 的tb.AMOUNT_MAX。這樣應(yīng)用端不需要預(yù)先知道也無需查詢賬戶余額。數(shù)據(jù)庫中實際記錄的amount會被設(shè)為實際轉(zhuǎn)移的金額見上表Amount (recorded)列T1記 10T3記 25。語義詳見 Transfer.flags.balancing_debit 與 Transfer.flags.balancing_credit。T2與T4是結(jié)賬轉(zhuǎn)賬closing transfers分別觸發(fā)借方賬戶/貸方賬戶的closed標(biāo)志。結(jié)賬轉(zhuǎn)賬必須是掛起轉(zhuǎn)賬pending這樣關(guān)閉動作才是可逆的。語義詳見 Transfer.flags.closing_debit 與 Transfer.flags.closing_credit。在 Transfer 模式表 中可以看到該組合的字段約束closing_debit/closing_credit只在pending模式下為true且pending模式下timeout可選而balancing_debit/balancing_credit與post_pending_transfer/void_pending_transfer互斥。提交后的狀態(tài)提交這些轉(zhuǎn)賬后A和B被關(guān)閉凈余額歸零并拒絕任何進(jìn)一步的轉(zhuǎn)賬AccountDebits PendingDebits PostedCredits PendingCredits PostedFlagsA020020debits_must_not_exceed_credits,closedB030030credits_must_not_exceed_debits,closedC025010控制賬戶C上的凈變動借方 25、貸方 10恰好對應(yīng)被關(guān)閉賬戶轉(zhuǎn)出的余額總和。底層原理closed 標(biāo)志如何被設(shè)置在狀態(tài)機實現(xiàn)中賬戶關(guān)閉邏輯位于轉(zhuǎn)賬提交路徑。核心流程src/state_machine.zig提交前校驗if (dr_account.flags.closed) return .debit_account_already_closed;、if (cr_account.flags.closed) return .credit_account_already_closed;src/state_machine.zig——這就是關(guān)閉后拒絕任何進(jìn)一步轉(zhuǎn)賬的校驗點提交時if (t.flags.closing_debit) dr_account_new.flags.closed true;、if (t.flags.closing_credit) cr_account_new.flags.closed true;——結(jié)賬轉(zhuǎn)賬一旦成功立即置位對應(yīng)賬戶的closed標(biāo)志標(biāo)志位定義位于 src/tigerbeetle.zig 的TransferFlags結(jié)構(gòu)體中balancing_debit、balancing_credit、closing_debit、closing_credit均為 u16 位域字段。由于結(jié)賬轉(zhuǎn)賬要求pending它對賬戶余額的影響先記入debits_pending/credits_pending掛起余額即掛起狀態(tài)轉(zhuǎn)移。也就是說余額歸零由平衡轉(zhuǎn)賬完成posted 方向關(guān)閉動作由掛起結(jié)賬轉(zhuǎn)賬完成pending 方向兩者在一條關(guān)聯(lián)鏈中原子生效。重新打開賬戶撤銷掛起結(jié)賬轉(zhuǎn)賬要重新打開已關(guān)閉的賬戶可以void撤銷掛起結(jié)賬轉(zhuǎn)賬——這會撤銷關(guān)閉動作但不會撤銷凈余額的轉(zhuǎn)移TransferDebit AccountCredit AccountAmountPending TransferFlagsT5AC0T2void_pending_transferT6CB0T4void_pending_transferT5通過pending_id T2撤銷A的結(jié)賬轉(zhuǎn)賬T6通過pending_id T4撤銷B的結(jié)賬轉(zhuǎn)賬pending_id語義見 Transfer.pending_id。提交后A和B重新打開可以再次接受轉(zhuǎn)賬AccountDebits PendingDebits PostedCredits PendingCredits PostedFlagsA020020debits_must_not_exceed_creditsB030030credits_must_not_exceed_debitsC025010注意A、B的余額保持為歸零后的凈值——重開只撤銷了關(guān)閉這個動作不追溯已完成的余額轉(zhuǎn)移。底層實現(xiàn)中void 路徑會斷言p.flags.closing_debit/p.flags.closing_credit與賬戶當(dāng)前closed狀態(tài)一致然后將closed標(biāo)志復(fù)位見 src/state_machine.zig。這正體現(xiàn)了結(jié)賬轉(zhuǎn)賬必須引用具體 pending 轉(zhuǎn)賬的原因它守護(hù)關(guān)閉/重開操作的順序防止關(guān)閉與撤銷的意外交錯。相關(guān)錯誤碼與注意事項調(diào)用create_transfers時可能遇到以下關(guān)鍵錯誤完整清單見 create_transfers 請求參考debit_account_already_closed/credit_account_already_closed賬戶已關(guān)閉時再次對其轉(zhuǎn)賬已被關(guān)閉的賬戶會拒絕一切普通轉(zhuǎn)賬exceeds_credits/exceeds_debits賬戶余額約束被違反src/state_machine.zig 計算出的平衡金額為 0 或不足時觸發(fā)flags_are_mutually_exclusiveclosing_debit與closing_credit等互斥標(biāo)志被同時設(shè)置src/state_machine.zigexists_with_different_amount重試平衡轉(zhuǎn)賬時傳入的最大金額不足以覆蓋實際已轉(zhuǎn)賬金額詳見 Transfer.flags.balancing_debit。實踐要點總結(jié)關(guān)閉賬戶前賬戶必須帶debits_must_not_exceed_credits或credits_must_not_exceed_debits約束之一平衡轉(zhuǎn)賬才能確定凈余額方向平衡轉(zhuǎn)賬 結(jié)賬轉(zhuǎn)賬必須組成 linked 鏈保證余額歸零與關(guān)閉標(biāo)志置位原子發(fā)生結(jié)賬轉(zhuǎn)賬必須帶pending這是關(guān)閉可逆可 void的前提被關(guān)閉賬戶上殘留的掛起轉(zhuǎn)賬仍可超時但不能 posted/voided重開賬戶只須 void 對應(yīng)的掛起結(jié)賬轉(zhuǎn)賬無需回滾凈余額轉(zhuǎn)移。完整的轉(zhuǎn)賬/賬戶字段約束與模式對照可進(jìn)一步參閱 Transfer 參考 與 Account 參考本方案在官方 Recipes 索引 docs/coding/recipes/README.md 中與其他常見業(yè)務(wù)場景幣種兌換、多借多貸、余額條件轉(zhuǎn)賬等并列可對照學(xué)習(xí)。【免費下載鏈接】tigerbeetleThe financial transactions database designed for mission critical safety and performance.項目地址: https://gitcode.com/GitHub_Trending/ti/tigerbeetle創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考