分布式锁和@Transactional注解一起使用锁失效问题(并不是真正的失效,只是读到数据有问题)
锁失效并不是真正的失效,只是读到数据,读取的数据库数据不是最新的。下面今行程序分析@Override@Transactionalpublic ReceiveH5ActivityPrizeResponse receive(ReceiveH5ActivityPrizeRequest request) {logger.info("getH5Acti...
·
分布式锁失效并不是真正的失效,只是读到数据,读取的数据库数据不是最新的。
下面今行程序分析
@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问题。
先加锁,然后在开启事物,可以保证安全性。

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