高清服务器大全,南宁网站优化公司哪家好,网站建设维护总结,网站文件保护怎么做转自廖雪峰老师的《交易系统如何确保账簿100%准确》
这篇文章阐述了一个交易系统中对账功能的关键#xff0c;即#xff1a;时刻保证资产负债表总额始终为 0。 交易系统中#xff0c;对账是一个大问题。对账处理不好#xff0c;不但需要花费大量的人力去处理账簿#xff…转自廖雪峰老师的《交易系统如何确保账簿100%准确》
这篇文章阐述了一个交易系统中对账功能的关键即时刻保证资产负债表总额始终为 0。 交易系统中对账是一个大问题。对账处理不好不但需要花费大量的人力去处理账簿还要承担很大的线上修改账簿的风险。
如果系统能自动化保证账簿每时每刻100%准确不能说一劳永逸地解决了所有问题至少解决了绝大部分问题。
如何对账能时刻确保账簿100%准确
交易系统中用户余额存储在账户表中。例如一个比特币交易系统假设用户有BTC和USD两种资产要确保账簿余额是对的一个设计的关键点就是时刻保证整个系统的资产负债表为零
设想账户表的初始状态用户A、B、C、D分别存入了数量不等的BTCBitcoin和USDUS dollar
usercurrencybalanceABTC1.2BUSD4000CBTC2.8DUSD6000
无论这些用户如何交易以什么价位交易最终的结果只是BTC和USD在账户之间移动其总额并不会增减
usercurrencybalanceABTC0.2AUSD3000BBTC1.0BUSD1000CBTC0.8CUSD6000DBTC2.0
把交易手续费考虑进来其实也是一样的只是用户的资产有很少一部分被移动到了系统手续费账户中
usercurrencybalanceABTC0.2AUSD2997BBTC1.0BUSD1000CBTC0.8CUSD5994DBTC2.0FEEUSD9
上面的账户表不好对账是因为根据“资产负债表总额始终为零”这一基本原理缺少一个关键的“负债”账户。
如果把初始状态加入负债账户
usercurrencybalanceDEBTBTC-4DEBTUSD-10000ABTC1.2BUSD4000CBTC2.8DUSD6000
整个账户表的余额加起来就一定为零。
随着交易的进行无论资产如何转移最终的账户余额也一定为零
usercurrencybalanceDEBTBTC-4DEBTUSD-10000ABTC0.2AUSD2997BBTC1.0BUSD1000CBTC0.8CUSD5994DBTC2.0FEEUSD9
因此可以设计出对账的基本逻辑
SELECT SUM(balance) FROM ACCOUNTS GROUP BY currency;
在每笔交易后执行该SQL语句如果账簿无误结果集必定每一行均为 0。
考虑到对账程序的执行效率可以把它放到只读从库执行不影响交易本身。
更进一步考虑系统初始状态的账户表
usercurrencybalance(无记录)(无记录)(无记录)
当用户X存入USD 1500后要保证资产负载表为0该存款操作本质上是一个资产转移过程USD 1500从DEBT账户转移到用户X的账户
usercurrencybalanceDEBTUSD-1500XUSD1500
取款过程则恰好相反它是用户资产转移到DEBT账户的过程体现为DEBT账户余额增加从负更多到负更少。
对于财务人员来讲用户总资产其实就是 ABS(DEBT) - FEE 计算极其简单。
可见一个清晰简洁而可靠的设计不但有力地保证了系统的安全性而且大大降低了财务对账成本。