public void secondBuyProduct(Jedis jedis, String stockId, int orders) {
//CAS重试
while (true) {
try {
//监视key,如果在后续事务执行之前key的值被其他命令所改动,那么事务将被打断
jedis.watch(stockId);
int prdNum = Integer.parseInt(jedis.get(stockId));
//判断库存是否满足订单数量要求
if (prdNum > 0 && prdNum - orders >= 0)) {
Transaction transaction = jedis.multi();
//减库存并写入
transaction.set(stockId, String.valueOf(prdNum - orders));
List<Object> res = transaction.exec();
//事务提交后如果为null,说明key值在本次事务提交前已经被改变,本次事务不执行。
if (res != null && !res.isEmpty()) {
System.out.println("抢购成功!");
break;
}
} else {
System.err.println("被抢光了!");
break;
}
} catch (Exception e) {
System.err.println("抢购出错:" + e.toString());
e.printStackTrace();
} finally {
jedis.unwatch();
}
}
}
共有 0 - 高并发下超卖问题及如何解决