页游mysql充值修改_mysql颠覆实战学习记录 :用户充值功能实现(一):当服务器卡顿7秒发生了什么 11...

1.首先创建两个表,充值日志表(user_balance_log)、用户余额表(user_balance)

表结构如下:

(1)user_balance:

7b1c48eb83e984d1c492aa0b22372d58.png

(2)user_balance_log:

5f9ee7d786e8e8fcc73cce3f8c25e00f.png

注:log_type 日志类型1代表充值 2代表消费 3代表转账

2.写存储过程模拟用户充值

BEGIN

#Routine body goes here...

declare t_error int default 0;

declare usercount int default 0 ;

declare CONTINUE HANDLER for SQLEXCEPTION set t_error=1;#当发生错误时,设置为1

start TRANSACTION;

#插入用户充值日志表

insert into user_balance_log(user_id,log_type,log_des,log_value) values(_user_id,_log_type,_log_des,_log_value);

if ROW_COUNT()>0 then #插入成功

select count(*) into usercount from user_balance where user_id = _user_id;

if usercount > 0 then #用户存在

update user_balance set user_money=user_money+_log_value where user_id=_user_id;

else

insert into user_balance(user_id,user_money) values(_user_id,_log_value);

end if;

end if;

select sleep(7),'卡顿结束';

if t_error=1 then

ROLLBACK;

else

COMMIT;

end if;

END

注:参数  IN _user_id int,IN _log_type tinyint,IN _log_des varchar(200),IN _log_value decimal(10,2)

3.执行存储过程

call sp_add_usermoney(3,1,'用户充值',10);

执行5次之后,用户充值日志表(user_balance_log)如下,

e20c4201247e3d349a8d17b7455bcf64.png

用户余额表(user_balance)如下:也就是说,执行了五次存储过程,每次充值10元,累加5次就是50元。

3dc2ddfd32feb54786ad65f6f6b8526e.png

4.模拟卡顿

在commit前模拟系统卡顿7秒,如下:

select sleep(7),'卡顿结束';

执行一次存储过程,然后打开另外一个会话,执行

da746e0b92f7a5735f8bc413881dce75.png

此时结果如下:

(1)用户充值日志表:

1b05fc03b8a72acd7b9e81200610ba4b.png

(2)用户余额表:

4f8caf3778aedbcd05cd2a17b17ce9d3.png

此时发现,用户余额表插入了同一个user_id的两行数据。因为系统卡顿后,存储过程中执行插入数据的操作并没有提交,而在另外一个会话中又插入了数据,这就产生了问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值