java减库存

问题:

假设当前库存200,现在需要减150库存
多线程并发时
AB同时开启事务,A先请求到行锁,
A:
start transaction;
select num from t ;先查询当前库存值
判断库存是否>=150,是的话,update t set num=num-150;

B:
start transaction;
select num from t ;先查询当前库存值
判断库存是否>=150,是的话,update t set num=num-150;
----结果---
A:查询到num=200,做了库存减量成了50
B:事务启动后,查询到也是200,等 A 释放了行锁,B进行update,直接变成 -100

解决方法:

select 加锁虽然可以(select num from t for update),但是会比较严重地影响并发数。

比较简单的做法是update语句的where 部分加一个条件: where nun >=150.(update t set num=num-150 where num >=150)
然后在程序里判断这个update 语句的affected_rows,
如果等于1 那就是符合预期;
如果等于0,那表示库存不够减了,业务要处理一下去,比如提示“库存不足”

你可能感兴趣的:(java减库存)