it_ape2233
it_ape2233
采纳率100%
2019-10-23 10:08

[并发]判断条件同时插入数据

已采纳

业务逻辑:
两个老师在同一或交叉时间段内在同一教室开课,只能有一个老师开课成功,
虽然在插入开课数据前,做了代码层面的判断,但通过压测,仍不能有效避免并发开课成功的结果,请问各位有没有一种有效的解决方案?

 //判断教室是否占用
                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的几率很少,但仍不能根本解决问题.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • guangcaiwudong Kevin.Y.K 2年前

    就是加锁机制,你这个系统给学校老师使用的,并发量不会太大,使用synchronized就可以解决了

    点赞 评论 复制链接分享
  • weixin_39233623 一条不愿透露姓名的咸鱼 2年前

    你可以参考下这篇文章并发

    点赞 评论 复制链接分享