记一次线上并发出现分布式锁失效的问题

记一次线上并发出现分布式锁失效的问题

背景:前些天公司的测试工程师说有用户反馈预约系统有问题,大概说是放出50个预约号会存在51个人预约的情况。

听到后第一时间想到的是:竟然我们公司的系统也有一定的并发量,赶紧先看一下数据。

在这里插入图片描述
看了数据发现确实存在2条数据在比较接近时间内插入成功。

记得自己有加分布式锁,难道是锁没加对位置,赶紧看一下代码。
public class DayEntity  implements java.io.Serializable {
	/**主键*/
	private String id;
	/**预约额度*/
	private Integer totalNum;
	/**已预约人数*/
	private Integer bookNum;
}
public class AppointmentUserEntity implements java.io.Serializable {
	/**主键*/
	private String id;
	private Date createDate;
	/**预约时段*/
	private String appointmentTime;
}

DayEntity dayEntity = this.get(DayEntity.class, dayId);//从库中找数据
if(RedissonLockUtil.tryLock(CacheKeys.BOOK_SYNC_LOCK+dayId , 300, 500)){//分布式锁
setAppointmentByDay(entity,dayEntity);//业务逻辑:会更改DayEntity 的bookNum值,并在AppointmentUserEntity表新建一条数据

尴尬了,认真一看锁的位置确实不太对,从数据库拿锁后再加锁,并发情况下,下次库中拿到的数据dayEntity有可能是旧的。于是改下这段代码再试试

if(RedissonLockUtil.tryLock(CacheKeys.BOOK_SYNC_LOCK+dayId , 300, 500)){//分布式锁
DayEntity dayEntity = this.get(DayEntity.class, dayId);//从库中找数据
setAppointmentByDay(entity,dayEntity);//业务逻辑:会更改DayEntity 的bookNum值,并在AppointmentUserEntity表新建一条数据
private
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值