java - 并发的修改1个字段,集群环境
伊谢尔伦
伊谢尔伦 2017-04-18 10:00:24
[Java讨论组]
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(1)
巴扎黑

代码不贴出来,怎么玩,在怎么也要把伪代码写出来吧
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();
    }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号