交易系统如何确保账簿100%准确
轉自廖雪峰老師的《交易系統如何確保賬簿100%準確》
這篇文章闡述了一個交易系統中對賬功能的關鍵,即:時刻保證資產負債表總額始終為 0。
交易系統中,對賬是一個大問題。對賬處理不好,不但需要花費大量的人力去處理賬簿,還要承擔很大的線上修改賬簿的風險。
如果系統能自動化保證賬簿每時每刻100%準確,不能說一勞永逸地解決了所有問題,至少解決了絕大部分問題。
如何對賬,能時刻確保賬簿100%準確?
交易系統中,用戶余額存儲在賬戶表中。例如,一個比特幣交易系統,假設用戶有BTC和USD兩種資產,要確保賬簿余額是對的,一個設計的關鍵點就是:時刻保證整個系統的資產負債表為零!
設想賬戶表的初始狀態,用戶A、B、C、D分別存入了數量不等的BTC(Bitcoin)和USD(US dollar):
| A | BTC | 1.2 |
| B | USD | 4000 |
| C | BTC | 2.8 |
| D | USD | 6000 |
無論這些用戶如何交易,以什么價位交易,最終的結果只是BTC和USD在賬戶之間移動,其總額并不會增減:
| A | BTC | 0.2 |
| A | USD | 3000 |
| B | BTC | 1.0 |
| B | USD | 1000 |
| C | BTC | 0.8 |
| C | USD | 6000 |
| D | BTC | 2.0 |
把交易手續費考慮進來,其實也是一樣的,只是用戶的資產有很少一部分被移動到了系統手續費賬戶中:?
| A | BTC | 0.2 |
| A | USD | 2997 |
| B | BTC | 1.0 |
| B | USD | 1000 |
| C | BTC | 0.8 |
| C | USD | 5994 |
| D | BTC | 2.0 |
| FEE | USD | 9 |
上面的賬戶表不好對賬,是因為根據“資產負債表總額始終為零”這一基本原理,缺少一個關鍵的“負債”賬戶。
如果把初始狀態加入負債賬戶:
| DEBT | BTC | -4 |
| DEBT | USD | -10000 |
| A | BTC | 1.2 |
| B | USD | 4000 |
| C | BTC | 2.8 |
| D | USD | 6000 |
整個賬戶表的余額加起來就一定為零。
隨著交易的進行,無論資產如何轉移,最終的賬戶余額也一定為零:
| DEBT | BTC | -4 |
| DEBT | USD | -10000 |
| A | BTC | 0.2 |
| A | USD | 2997 |
| B | BTC | 1.0 |
| B | USD | 1000 |
| C | BTC | 0.8 |
| C | USD | 5994 |
| D | BTC | 2.0 |
| FEE | USD | 9 |
因此,可以設計出對賬的基本邏輯:
SELECT SUM(balance) FROM ACCOUNTS GROUP BY currency;在每筆交易后執行該SQL語句,如果賬簿無誤,結果集必定每一行均為?0。
考慮到對賬程序的執行效率,可以把它放到只讀從庫執行,不影響交易本身。
更進一步,考慮系統初始狀態的賬戶表:
| (無記錄) | (無記錄) | (無記錄) |
當用戶X存入USD 1500后,要保證資產負載表為0,該存款操作本質上是一個資產轉移過程:USD 1500從DEBT賬戶轉移到用戶X的賬戶:
| DEBT | USD | -1500 |
| X | USD | 1500 |
取款過程則恰好相反,它是用戶資產轉移到DEBT賬戶的過程,體現為DEBT賬戶余額增加(從負更多到負更少)。
對于財務人員來講,用戶總資產其實就是?ABS(DEBT) - FEE?,計算極其簡單。
可見,一個清晰簡潔而可靠的設計,不但有力地保證了系統的安全性,而且大大降低了財務對賬成本。
?
總結
以上是生活随笔為你收集整理的交易系统如何确保账簿100%准确的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode算法入门- Remove
- 下一篇: 怎么使用mysql打表_MySQL的表使