数据库锁

今天财务在后台手工充值的时候, 由于系统反应慢, 点了两次, 结果是流水记了两笔, 金额只增加了一笔


今天用开两个SQLyog客户端来还原财务充值发生的情况, 以下SQL在多线程下执行, 将会出现写覆盖。

 如果只执行select amount from t_test where id=91是不加任何锁的,因此在update提加之前, 这条语句也能执行。

BEGIN;
SELECT @a:=amount FROM t_test WHERE id = 91;   (两条线程同时执行到了这儿)
-- SELECT @a:=amount FROM t_test WHERE id = 91 for update;  (两条线程同时卡在这儿, 这时状况发生了, 估计是有另外一个比较大的事务里面锁住了这行记录)
SET @a=@a+10;
SELECT @n:=@a;
UPDATE t_test SET amount = @a WHERE id = 91;
SELECT @a:=amount FROM t_test WHERE id = 91;
COMMIT;
ROLLBACK;


解决方案, 用乐观锁, 如果发现amount已经更改, 则提示修改不成功

update t_test set amount = amount + 10 where id =91 and amount = @originalAmount.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值