推荐在数据库中处理,适合分布式场景
用数据库行锁去限制,
String goodsId = "商品id";
int num = "本次需要扣减的库存量";
// count表示影响行数
int count = (update t_goods set num = num - #{num} where goods_id = #{goodsId} and num - #{num} >= 0);
// count = 1,表示扣减成功,否则扣减失败
if(count==1){
//扣减库存成功
}else{
//扣减库存失败
}
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'; 事务默认超时时间是50秒
1、排他锁
image.png
image.png
如果将mapper里面的代码换成 for update
当一个线程走到55行的时候,另一个线程走到53行就会报如下错误
image.png
2、共享锁
image.png
image.png
【共享锁可以防止在查询过程中数据被意外修改,有助于维护数据的完整性。】【可以并发读】
如果将mapper里面的代码换成 lock in share mode
当一个线程走到55行的时候,另一个线程也走到55行就会报如下错误
image.png
多线程调试看这个https://www.jianshu.com/p/22dc499ef1f8