Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载)

Java开源生鲜电商平台-OMS订单系统中并发问题和锁机制的探讨与解决方案(源码可下载)

说明:Java开源生鲜电商中OMS订单系统中并发问题和锁机制的探讨与解决方案:

问题由来

    假设在一个订单系统中(以火车票订单系统为例),用户A,用户B都要预定从成都到北京的火车票,A、B在不同的售票窗口均同时查询到了某车厢卧铺中、下铺位有空位。用户A正在犹豫订中铺还是下铺,这时用户B果断订购了下铺。当用户A决定订下铺时,系统提示下铺已经被预订,请重新选择铺位。在这个系统场景中,我们来探讨一下,火车票系统是怎样处理并发事件以及怎么利用锁机制来避免重复订票的。

设想的方案

方案1:

    为了避免重复订票,大部分人会想到在做订票操作前,去数据库查询该铺位是否已经被预订,假设“铺位”数据库表增加标记字段FLAG(空闲:0;已预订:1),如果查询到铺位的FLAG字段值为1,那么预订就不成功,如果为0就成功预订,并把FLAG置为1。这种方案如果在业务量很少的系统中,或许可行。但业务量较大时,特别是火车票这样的业务量,就会出现问题。问题在,当用户A、用户B同时对同一铺位预订时,虽说是“同时”,但对于数据库操作来说一定是有先后顺序的,假设A在查询该铺位的FLAG时,值为0,准备预订并将值设为1,而与此同时B已经预订成功,并已将FLAG设为1。而A因为没有即时查询到FLAG=1,因此也预订成功,又将FLAG设为1。

A      FLAG=0      时刻=T1   (查询)

B      FLAG=0      时刻=T2   (查询)

B      FLAG=1      时刻=T3   (更新)

A      FLAG=1      时刻=T4   (更新)

这样就造成了重复订票,在购票高峰期,使用这样的方案,重复订票不可避免。

方案2:

    我们想到了利用数据库的悲观锁来解决这个问题,设想假如用户A查询到想预订的票,用户B根本都查询不到,只有A一个人能看到,那是不是没有重复订票的可能了,因为压根没人跟他抢。可以这样实现这个方案:

select * from table where …… for update skip locked,该语句是查询用户指定条件的票信息,并加锁(for update),如果有记录已经被锁则自动跳到下一条记录(skip locked),这样谁先查询谁就可以慢慢的考虑要上铺还是下铺。但火车票系统是这样做的吗?显然不是,因为这样用户体验太不好,票实际还很多,但确看不到买不到,这显然不合理。

方案3:

    我们又想到了从程序层面来解决并发问题,最简便的方式是利用synchronized来处理,但我们要知道一个大型系统必然是集群方式部署的,synchronized只能解决单节点环境的并发问题,要解决此问题还是必须依赖全局性的锁机制。

方案4:

    既然又回到了在数据库上加锁,我们又想一下如果我们在查询时,使用乐观锁,但在预订之前使用悲观锁会怎样呢?例如我们查询时:

select * from table where ……

用户A、用户B都查询到了相同的票信息(中铺和下铺),用户A或用户B在预订时做一次悲观锁:

select * from table where …… for update(只对预订的票做悲观锁)

此时后者在预订时,无法获取该记录的锁,自然就无法预订,避免了重复预订的问题。

目录:
1.Java开源生鲜电商平台-系统简介 https://www.cnblogs.com/jurendage/p/9012355.html
2.Java开源生鲜电商平台-系统架构与技术选型(源码可下载) https://www.cnblogs.com/jurendage/p/9012922.html
3.Java开源生鲜电商平台-盈利模式详解(源码可下载) https://www.cnblogs.com/jurendage/p/9016411.html
4.Java开源生鲜电商平台-用户表的设计(源码可下载) https://www.cnblogs.com/jurendage/p/9017912.html
5.Java开源生鲜电商平台-商品表的设计(源码可下载) https://www.cnblogs.com/jurendage/p/9022917.html
6.Java开源生鲜电商平台-订单表的设计(源码可下载) https://www.cnblogs.com/jurendage/p/9029467.html
7.Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9034444.html
8.Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9039195.html
9.Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9044283.html
10.Java开源生鲜电商平台-财务系统模块的设计与架构(源码可下载)https://www.cnblogs.com/jurendage/p/9049318.html
11.Java开源生鲜电商平台-账单模块的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9053417.html
12.Java开源生鲜电商平台-提现模块的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9053523.html
13.Java开源生鲜电商平台-订单抽成模块的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9059304.html
14.Java开源生鲜电商平台-搜索模块的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9062649.html
15.Java开源生鲜电商平台-售后模块的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9066307.html
16.Java开源生鲜电商平台-监控模块的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9070442.html
17.Java开源生鲜电商平台-异常模块的设计与架构(源码可下载)https://www.cnblogs.com/jurendage/p/9075219.html
18.Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9081062.html
19.Java开源生鲜电商平台-安全设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9087581.html
20.Java开源生鲜电商平台-优惠券设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9091587.html
21.Java开源生鲜电商平台-通知模块设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9095078.html
22.Java开源生鲜电商平台-团购模块设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9098368.html
23.Java开源生鲜电商平台-服务器部署设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9103339.html
24.Java开源生鲜电商平台-系统报表设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9108863.html
25.Java开源生鲜电商平台-源码地址公布与思考和建议 https://www.cnblogs.com/jurendage/p/9114796.html
26.Java开源生鲜电商平台-RBAC系统权限的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9120168.html
27.Java开源生鲜电商平台-物流配送的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9124947.html
28.Java开源生鲜电商平台-库存管理设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9130455.html
29.Java开源生鲜电商平台-销售管理设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9131557.html
30.Java开源生鲜电商平台-电商促销业务分析设计与系统架构(源码可下载) https://www.cnblogs.com/jurendage/p/9137815.html
31.Java开源生鲜电商平台-一次代码重构的实战案例(源码可下载) https://www.cnblogs.com/jurendage/p/9143105.html
32.Java开源生鲜电商平台-商品价格的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9148906.html
33.Java开源生鲜电商平台-定时器,定时任务quartz的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9153835.html
34.Java开源生鲜电商平台-高并发的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9159020.html
35.Java开源生鲜电商平台-技术方案与文档下载(源码可下载) https://www.cnblogs.com/jurendage/p/9162190.html
36.Java开源生鲜电商平台-积分,优惠券,会员折扣,签到、预售、拼团、砍价、秒杀及抽奖等促销模块架构设计(源码可下载) https://www.cnblogs.com/jurendage/p/9165594.html
37.Java开源生鲜电商平台-供应链模块的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9171467.html
38.Java开源生鲜电商平台-会员积分系统的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9176010.html
39.Java开源生鲜电商平台-redis缓存在商品中的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9181380.html
40.Java开源生鲜电商平台-商品无限极目录的设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9185990.html
41.Java开源生鲜电商平台-物流动态费率、免运费和固定运费设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9189736.html
42.Java开源生鲜电商平台-商品的spu和sku数据结构设计与架构(源码可下载) https://www.cnblogs.com/jurendage/p/9194551.html
43.Java开源生鲜电商平台-你应该保留的一些学习态度与学习方法(源码可下载) https://www.cnblogs.com/jurendage/p/9197096.html

Java开源生鲜电商平台-Java后端生成Token架构与设计详解(源码可下载),如果需要下载的话,可以在我的github下面进行下载。  

https://github.com/137071249/

群号:168096884 

猜你喜欢

转载自www.cnblogs.com/jurendage/p/9222635.html