账户系统数据模型
每次交易的时候,根据用户ID去更新这个账户的余额即可。
对不上账
为了性能,一般会冗余账户余额和交易流水,二者都可以得到账户余额数据。针对交易流水,流水号是递增的,并且记录只能新增,不允许修改和删除。
对不上账本质问题是:冗余数据的一致性。
使用事务保证数据一致性
把更新账户余额和记录交易流水放在一个事务中,通过事务保证二者要么同时成功,要么同时失败。
事务隔离级别
解决方案,在隔离级别为RC和RR时,都是安全的:
- 在账户余额表增加版本字段,可以使用最后一次更新余额表时的流水号。后续更新余额表时,需要带上该字段。
- 首先开启事务,查询并记录当前账户的余额和最后一笔交易的流水号。
- 然后写入流水记录。
- 再更新账户余额,需要在更新语句的 WHERE 条件中限定,只有流水号等于之前查询出的流水号时才更新。
- 然后检查更新余额的返回值,如果更新成功就提交事务,否则回滚事务。
此文章为3月Day4学习笔记,内容来源于极客时间《后端存储实战课》