记一次线上并发出现分布式锁失效的问题
背景:前些天公司的测试工程师说有用户反馈预约系统有问题,大概说是放出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