一、业务需求(大家有类似的也可以参考我的解决方案)

实现一种类似于医院预约的预约功能,在同一个时间段,可能大家都看得到这个预约的按钮,大家都点进去了,这个时候真正提交预约信息的时候,就会可能出现多个请求同一个时间段的预约,在service层中,有可能会造成并发问题:几个线程可能都读到时间段的status(数据库中字段)为1,大家都能提交预约了

二、解决方案

方案一:select for update + @Transactional

在对应的service层方法中加上这个注解,手动开启事务,这会导致我们这个方法全部执行完毕之后,才会进行事务的提交,不然则不会提交事务,途中如果有异常,则会rollback,出现状态码500

select for update 这句话会将数据库查到的数据进行加上悲观锁(查到多少就加多少行的锁,会导致更大的问题,大家请精确到一行数据进行加锁),加上锁之后,其他线程想要执行这条语句的时候就会被阻塞的

什么时候会释放锁呢?要等到我们这个方法完成了,事务提交了就会进行释放锁(正常情况下)

这里简单跟大家说select for update加的行级锁知识和该注解的知识

select for update:

for update是一种行级锁,又叫排它锁,一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁的数据行,其它用户只能查询但不能更新被加锁的数据行.如果其它用户想更新该表中的数据行,则也必须对该表施加行级锁.即使多个用户对一个表均使用了共享更新,但也不允许两个事务同时对一个表进行更新,真正对表进行更新时,是以独占方式锁表,一直到提交或复原该事务为止。行锁永远是独占方式锁。

只有当出现如下之一的条件,才会释放共享更新锁:
1、执行提交(COMMIT)语句
2、退出数据库(LOG OFF)
3、程序停止运行

@Transactional:

实现原理:
 
1) 事务开始时,通过AOP机制,生成一个代理connection对象,
   并将其放入 DataSource 实例的某个与 DataSourceTransactionManager 相关的某处容器中。
   在接下来的整个事务中,客户代码都应该使用该 connection 连接数据库,
   执行所有数据库命令。
   [不使用该 connection 连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚]
  (物理连接 connection 逻辑上新建一个会话session;
   DataSource 与 TransactionManager 配置相同的数据源)
 
2) 事务结束时,回滚在第1步骤中得到的代理 connection 对象上执行的数据库命令,
   然后关闭该代理 connection 对象。
  (事务结束后,回滚操作不会对已执行完毕的SQL操作命令起作用)

方案二(方案一改进版):update + @Transactional(update数据库表中时间段的status)

该方法用update直接上独占锁(悲观锁),对比上一个方案,我们的范围缩小了

update完了之后可以返回数字1 or 0,如果1则表示更新成功,0则表示更新失败

0则返回controller,表示提交预约失败,以此来防止我们的并发问题

三、总结

1、得进行学习springboot得一些注解

2、学习进阶mysql锁的知识

3、有时候不进行正式的公司开发流程,真的不知道高级并发处理该咋搞

4、准备学习一下MybatisPlus

5、方案二的做法对比与方案一其实像乐观锁,大家可以细细品一下

6、update完status之后如果update成功的话就会submit我们的预约

Springboot解决业务并发问题相关推荐

  1. 乐观锁 -业务判断 解决高并发问题

    在解决高并发问题时,如果是分布式系统显然我们只能够使用数据库端加锁机制来解决这个问题,但是这种同步机制或者数据库物理锁机制会牺牲一部分的性能,所以常常以另外一种方式来解决这个问题 就是乐观锁模式 银行 ...

  2. springboot中使用Redis解决高并发的方法

    一.集成redis 1.引入redis的依赖 <dependency><groupId>org.springframework.boot</groupId>< ...

  3. Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库

    前言 最近在做阅读类的业务,需要记录用户的PV,UV: 项目状况:前期尝试业务阶段: 特点: 快速实现(不需要做太重,满足初期推广运营即可) 快速投入市场去运营 收集用户的原始数据,三要素: 谁 在什 ...

  4. asp.net怎样解决高并发问题

    队列+多线程+couchbase缓存 ,解决高并发问题. using System; using System.Collections.Generic; using System.Linq; usin ...

  5. 每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享...

    本文来源于caoz梦呓公众号高并发专辑,以图形化.松耦合的方式,对互联网高并发问题做了详细解读与分析,"技术在短期内被高估,而在长期中又被低估",而不同的场景和人员成本又导致了巨头 ...

  6. 转发:php解决高并发

    php解决高并发(转发:https://www.cnblogs.com/walblog/articles/8476579.html) 我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Pe ...

  7. 91免费视频Redis+Lua解决高并发场景在线秒杀问题

    为何要使用Lua脚本解决商品超卖的问题呢? Redis在2.6版本后原生支持Lua脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行. 将复杂的或者多步的redis操作,写为一个脚本,一次 ...

  8. springboot实现高并发红包系统(java 全网最全包括语音口令 文字口令 普通 拼手气)

    博主技术笔记 博主开源微服架构前后端分离技术博客项目源码地址,欢迎各位star springboot实现高并发红包系统(全网最全) 下面的业务处理请根据你们实际的场景进行处理 1.sql设计 CREA ...

  9. mysql乐观锁 秒杀_使用数据库乐观锁解决高并发秒杀问题,以及如何模拟高并发的场景,CyclicBarrier和CountDownLatch类的用法...

    数据库:mysql 数据库的乐观锁:一般通过数据表加version来实现,相对于悲观锁的话,更能省数据库性能,废话不多说,直接看代码 第一步: 建立数据库表: CREATE TABLE `skill_ ...

最新文章

  1. php学习之道:WSDL具体解释(三)
  2. jdk动态代理源码学习
  3. cocos2dx 坐标系统详解
  4. 超级计算机的英语作文80字,英语作文_为什么这台超级计算机如此快? (有声) _沪江英语...
  5. ASP.NET Core 6.0对热重载的支持
  6. JS中的Replace方法
  7. Python2 圆满落幕,Python 继续辉煌! | 原力计划
  8. 福利来了!本人近300G的学习资料愿与大家分享
  9. Araxis Merge for Mac(可视化文件比较合并工具)支持m1
  10. 蓝牙芯片 csr8645 和 qcc3005 哪个比较
  11. MYMPS蚂蚁分类信息系统源码,5.9E多城市全开源版本
  12. 软件测试教务系统测试用例,教务管理系统测试用例.doc
  13. Onenote无法登录报错显示0xE000078D解决方法
  14. 7-2 买电影票 (C语言)
  15. 精读-软件测试的艺术之代码检查,走查与评审
  16. 打开浏览器时主页被锁定怎么也改不掉的一个好办法
  17. 函数:fopen的使用方法
  18. 人文思考与科研探索之管锥篇
  19. 苹果手机输入法软件测试,苹果手机三款输入法谁更牛?专业媒体评测后给出结果...
  20. 毕设记录1||不要守株待兔

热门文章

  1. 信息储存单位及其之间换算
  2. OpenCV3.1.0+VS2013配置+Win10(64位)(转载)
  3. matlab微积分计算
  4. 老朋友好久不见,愿你在天堂安好
  5. 岛屿问题(岛数量/孤岛/面积/周长)
  6. 作为一名成年人的程序员,如何刻意去结交朋友,结交什么样的朋友?
  7. 使用InstallUtil安装或卸载服务
  8. 网络云盘项目——Nginx配置(配置Nginx访问FastCGI、FastDFS)
  9. uniapp|微信小程序获取当前城市名称--逆地址解析
  10. 决心书-- 一个对Linux懵懂无知的少年