线上账务系统余额并发更新问题记录,账务余额
线上账务系统余额并发更新问题记录
某电商平台,某天线上用户报bug说账户余额信息与交易流水对不上。可以认为是数据库并发更新问题,由此定位出具体原因,并给出解决方案。
问题现象
场景描述
线上账务系统,在定时结算给卖家钱时,且高并发量的情况下,出现提现x元(假设当前用户余额为x元)余额为0后,再转入该账户一笔钱(假设为y元),结果账户余额变为了x+y 元,导致用户余额错误。 ps:账户余额的变更都是在事务中update的
环境说明
mysql5.7 + innodb,事务隔离级别是REPEATABLE-READ
场景模拟
我们简化下线上的数据结构,进行场景模拟。 数据表如下:
‘账户主表’
CREATE TABLE user (
uid int(11) NOT NULL COMMENT '类型id+自增序列',
name varchar(32) DEFAULT NULL,
PRIMARY KEY (uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='账户主表'
‘账户余额明细表’
CREATE TABLE user_account (
uid int(11) NOT NULL,
amount decimal(19,4) DEFAULT 0 COMMENT '账户余额',
PRIMARY KEY (uid)
) ENGINE=InnoDB DE