扫码关注官方订阅号
小伙看你根骨奇佳,潜力无限,来学PHP伐。
代码不贴出来,怎么玩,在怎么也要把伪代码写出来吧lock.lock(Integer.parseInt("10"), TimeUnit.SECONDS);这句的问题如果有多个请求过来,比如说有人手贱多点了几次第一个请求拿到锁后,更新数据,后面的请求会阻塞,并不过直接跳过去,等第一个请求执行完成后释放锁,后续的请求又拿到锁了,所以又执行了应该是这样一个逻辑就ok了,同时来了多个请求,第一个请求拿到锁执行代码逻辑,后面的请求直接跳过就不会出现你的问题了应该是你api用错了,用这个boolean tryLock()类似代码
updateFieldAndInsertRecordConcurrently(Integer id) { try{ RLock lock = redisClientManager.getClient().getLock("Activity_Price_Off_midAutumnLock"; if(lock.tryLock()){ //从B表读取价格 BigDecimal currentPrice = getCuurentPrice(); //随机一个价格,减掉 BigDeciaml randomOffPrice = getRandomOffPrice(); //最终价格 BigDecimal resultPrice = currentPrice.subtract(randomOffPrice); //插入A记录(起始价格,随机价格,优惠后价格) insertARecordByUserId(id, currentPrice, randomOffPrice, resultPrice ) ; //更新B表的价格栏位 updateCurrentPrice(resultPrice); } }catch(Exception e) {} finally { lock.unlock(); } }
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
代码不贴出来,怎么玩,在怎么也要把伪代码写出来吧
lock.lock(Integer.parseInt("10"), TimeUnit.SECONDS);这句的问题
如果有多个请求过来,比如说有人手贱多点了几次
第一个请求拿到锁后,更新数据,后面的请求会阻塞,并不过直接跳过去,等第一个请求执行完成后释放锁,后续的请求又拿到锁了,所以又执行了
应该是这样一个逻辑就ok了,同时来了多个请求,第一个请求拿到锁执行代码逻辑,后面的请求直接跳过就不会出现你的问题了
应该是你api用错了,用这个boolean tryLock()
类似代码