业务逻辑:
两个老师在同一或交叉时间段内在同一教室开课,只能有一个老师开课成功,
虽然在插入开课数据前,做了代码层面的判断,但通过压测,仍不能有效避免并发开课成功的结果,请问各位有没有一种有效的解决方案?
//判断教室是否占用
if (class_update_status == 1) {
boolean canUse = classroomCanUse(class_id, startInputDate, endInputDate);
//教室不可用
if (!canUse) {
return ResultBean.setOk(1, "添加课时失败,该时间段此教室已被占用,请预约其他教室");
}
}
int i = lessonPeriodMapper.insertPeriod(period);
//添加直播课时成功
if (i > 0) {
int new_period_id = period.getPeriod_id();
int seconds=(int)((endTime- System.currentTimeMillis())/1000);
redisUtils.setex(new_period_id + "_ossurl",seconds,oss_path);
map.put("period_id", new_period_id);
updateProgressPriodNumber(lesson_id);
return ResultBean.setOk(0, "添加直播课时成功", map);
}
开启100个并发线程
当执行延迟为1s时候并不会出现并发插入多条成功的情况,延迟为0s时候最多出现并发插入成功5条,实际场景虽然出现延迟0s的几率很少,但仍不能根本解决问题.