转自:https://zq99299.github.io/note-book/back-end-storage/01/04.html#为什么总是对不上账
1.对账介绍
对不上账 「是通俗的说法」,它的本质问题是,冗余数据的一致性问题。这里的冗余数据并 不是多余或者重复的数据,而是多份含有相同信息的数据。
比如,我们完全可以通过用户的每一笔充值交易数据、消费的订单数据,来计算出这个用户当前的账户余额是多少。也就是说,账户余额数据和这些账户相关的交易记录,都含有 「账户余额」 这个信息,即流水和余额之间就互为冗余数据。在设计系统的存储时,原则上不应该存储冗余数据,一是浪费存储空间,二是让这些冗余数据保持一致是一件非常麻烦的事儿。
但有些场景下存储冗余数据是必要的,比如用户账户的余额这个数据。这个数据在交易过程中会被 非常频繁地用到,总不能每次交易之前,先通过所有历史交易记录计算一下当前账户的余额,这样做速度太慢了,性能满足不了交易的需求。所以账户系统保存了每个用户的账户余额,这实际上是一种用 存储空间换计算时间 的设计。
但如果只记录余额信息,每次交易的时候更新账户余额,这样做有一个问题,如果账户余额被篡改,是没有办法追查的,所以在记录余额的同时,还需要记录每一笔交易记录,也就是账户的流水。记录流水,可以有效地修正由于系统 Bug 或者人为篡改导致的账户余额错误的问题,也便于账户系统与其他外部系统进行对账,所以 账户系统记录流水是非常必要的。
流水的数据模型至少需要包含:流水 ID、交易金额、交易时间戳以及交易双方的系统、账户、交易单号等信息。
2.事务保证数据一致性
不能提供 单独更新余额或者流水的功能,只提供交易功能。
需要在实现交易功能的时候,同时记录流水并修改余额,并且要尽可能保证,在任何情况下,记录流水和修改余额这两个操作,要么都成功,要么都失败。不能有任何一笔交易出现,记录了流水但余额没更新,或者更新了余额但是没记录流水。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/282576.html