分布式锁失效并不是真正的失效,只是读到数据,读取的数据库数据不是最新的。

下面今行程序分析

    @Override
    @Transactional
    public ReceiveH5ActivityPrizeResponse receive(ReceiveH5ActivityPrizeRequest request) {
        logger.info("xxx:{}", JSON.toJSONString(request));
        ReceiveH5ActivityPrizeResponse response=new ReceiveH5ActivityPrizeResponse();
        String lockName="receiveH5ActivityPrize" + request.getActivityId();
        final DistributeLock lock = jedisLockFactory.getJedisLock(lockName,20, TimeUnit.SECONDS);
        // 1.加锁
        lock.lock();
        try {
            //todo 
            // 2 业务逻辑 先判断是否存在,不存在插入一条数据,存在返回(不插入)
        } finally {
            // 3.释放锁
            lock.unLock();
        }
        // 4 返回
        return response;
    }

比如上边程序,Transactional注解在执行该方法时开启一个事物,当执行到3步时,insert事物务还未提交,因此其它线程进入分布式锁代码块后,继续会执行2操作,发现数据不存在继续插入一条新数据,存在两条记录,此时数据就会出现bug问题。

先加锁,然后在开启事物,可以保证安全性。 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐