通过锁和事务实现一个用户创建一个空间(智能协同云图库——空间模块)

通过锁和事务实现一个用户创建一个空间

  • 为什么要加锁:
    • 答:防止同一个用户在短时间内,连续点击提交创建空间请求,导致一个用户创建多个空间
  • 怎样加锁:
    • 答:要保证同一个用户拿到的是同一个锁的话,需要用空间关联的userId来加锁,注意这里应该使用intern()方法获得存储在常量池中的数据,不然的话,一次请求就会创建一个新的String对象。
      • 加锁不用类对象的原因:使用类对象的话,该方法的执行就变成了串行,效率极低。
      • 加锁不用实例的原因:使用实例的话,每次请求都是一个新的实例。后面来的无法获取到前者的实例
  • 为什么要加编程式事务:
    • 答:Spring的声明式事务会只会在方法执行结束的时候,才会去提交到数据库。如果此时有两个用户A,B都执行到加锁的地方,然后A方法拿锁先执行到//A位置,此时该用户已经创建了空间,但是声明式事务并没有提交,锁也已经释放了。这时候B方法执行查询数据库,结果仍然是该用户没有创建空间。这中情况就会导致一个用户创建两个空间。
  • 只加锁的方案
java
复制代码
{/*...........*/ //4. 控制同一用户只能创建一个普通空间——操作数据库 String lock = String.valueOf(userId).intern();//每个用户一把锁 //A B synchronized (lock) { //判断该用户是否已创建用户空间 boolean exists = this.lambdaQuery() .eq(Space::getUserId, userId) .exists(); if (exists) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户已创建过普通空间"); } boolean save = this.save(space); ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "创建空间失败"); return space.getId(); } //A }
  • 最终方案
java
复制代码
//4. 控制同一用户只能创建一个普通空间——操作数据库 String lock = String.valueOf(userId).intern();//每个用户一把锁 synchronized (lock) { Long newSpaceId = transactionTemplate.execute(status -> { //判断该用户是否已创建用户空间 boolean exists = this.lambdaQuery() .eq(Space::getUserId, userId) .exists(); if (exists) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户已创建过普通空间"); } boolean save = this.save(space); ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "创建空间失败"); return space.getId(); }); return Optional.ofNullable(newSpaceId).orElse(-1L); }
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
鱼友8621
作者分享
# 毕业一年,失业半年,三份劳动合同 毕业前一年,一边在教室尽自己最大的耐力学习,一边焦虑着自己的竞争力,不停怀疑自己。总觉得自己比起其他人很差劲,知识深度浅,面窄。一直焦虑,一直没敢付诸行动,做事束手束脚。到了去年八月末,在近期面试三四家的情况下,糊里糊涂进了公司,还没入职,就已经从制度,福利,公司气氛,业务中感受到了各种不舒服(入职a,与b签合同,在c打卡),入职第一周,就已经想离职了。但我更害怕出来找不到工作,于是硬着头皮待了下去。中间又签署了一份劳动合同,从b改签到了a。最后由于种种事情累加在一起,我终于下定决心离职。离职期间有过玩乐,逃避,重新面试,挫败,幸运,遗憾,无所谓,随缘。期间也明白了在资源和硬实力拉不开差距时,时势造就英雄。目前随缘到了第三份劳动合同跟前,目前来说,这次的工作非常符合我去年对工作的期望的。总感觉自己实际生活的发展晚同辈人一步。学前班升一年级,我留级;高考,我复读;进路局,我升本;初入社会,我焦虑踌躇。
5
Java智慧水利这个方向发展如何呢?公司背景是中核和其他几个民营企业合资的,规模99到20人。里面百分之八十是中年人。
2
25届专升本在北京的低代码公司工作
3
25届无实习经历,现在该怎么办呢?😵我是专升本
4
使用`注解`+`AOP`来完成用户权限验证(智能协同云图库项目)
7
下载 APP