账户系统

269 阅读1分钟

账户系统数据模型

image.png

每次交易的时候,根据用户ID去更新这个账户的余额即可。

对不上账

为了性能,一般会冗余账户余额和交易流水,二者都可以得到账户余额数据。针对交易流水,流水号是递增的,并且记录只能新增,不允许修改和删除。

对不上账本质问题是:冗余数据的一致性。

使用事务保证数据一致性

把更新账户余额和记录交易流水放在一个事务中,通过事务保证二者要么同时成功,要么同时失败。

事务隔离级别

image.png

解决方案,在隔离级别为RC和RR时,都是安全的:

  1. 在账户余额表增加版本字段,可以使用最后一次更新余额表时的流水号。后续更新余额表时,需要带上该字段。
  2. 首先开启事务,查询并记录当前账户的余额和最后一笔交易的流水号。
  3. 然后写入流水记录。
  4. 再更新账户余额,需要在更新语句的 WHERE 条件中限定,只有流水号等于之前查询出的流水号时才更新。
  5. 然后检查更新余额的返回值,如果更新成功就提交事务,否则回滚事务。

此文章为3月Day4学习笔记,内容来源于极客时间《后端存储实战课》