SPRING MVC 多用户并发,数据错误

cdns20150714 2017-10-31 10:21:48
框架: springmvc + mybatis
业务: 在多用户并发购买商品的时候,发现用户总的购买量>某商品的剩余库存。
比如某商品库存为100个,但在多用户购买的情况下,sum(用户购买的的总量) > 100了。
目前实现方式:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" isolation="READ_COMMITTED"/>
</tx:attributes>
</tx:advice>
<aop:config expose-proxy="true">
<aop:pointcut id="txPointcut"
expression="execution(* com.my.abc..*.*(..))" />
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice" />
</aop:config>
Controller调用service层buy()方法, Controller加了 @Scope("prototype")。
业务逻辑都写在service层,service层首先判断了用户购买的数量是否大于剩余库存。如果小于等于,才可以购买。

要怎么样解决这个问题,请高手指点????
...全文
444 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 zc881124 的回复:
正好和面试官讨论了下,这是讨论过后的方案,有什么不妥?
别激动,没说你的方案不对。你的方案很好啊
110成成 2017-11-01
  • 打赏
  • 举报
回复
引用 4 楼 shijing266 的回复:
[quote=引用 3 楼 zc881124 的回复:] 首先前端要做限量,比如一个IP 不能多次请求,一个账号不能多次请求 接着将请求放入队列中,按顺序请求,同时队列设置超时时间,一段 时间没处理,请自动移出队列,底层可以使用使用乐观锁 或者在上层使用原子,除此之外redis也有相关的接口可以操作。
你这得分 ,万年老二啊 [/quote] 什么意思?这个问题,我前段时间去讯飞面试,正好有这个问题 正好和面试官讨论了下,这是讨论过后的方案,有什么不妥?
110成成 2017-11-01
  • 打赏
  • 举报
回复
首先前端要做限量,比如一个IP 不能多次请求,一个账号不能多次请求 接着将请求放入队列中,按顺序请求,同时队列设置超时时间,一段 时间没处理,请自动移出队列,底层可以使用使用乐观锁 或者在上层使用原子,除此之外redis也有相关的接口可以操作。
  • 打赏
  • 举报
回复
数据库乐观锁 在你sql修改库存的时候,加上一个限制条件:购买数<库存数 然后才能扣减成功
Lxinccode 2017-11-01
  • 打赏
  • 举报
回复
可以使用redis数据库做库存管理,因为redis是单线程的
繁华终归落尽 2017-11-01
  • 打赏
  • 举报
回复
1.最省力的办法,购买逻辑加上同步 2.更新的时候校验库存,一般并发量应该也没有什么问题

update product set position = position - #{sum} where id = #{id} and position >= #{sum}
3.乐观锁,加失败尝试

update product set position = position - #{sum},version = version + 1 where id = #{id} and version = #{version}
4.用队列Redis加锁超时等等等等
maradona1984 2017-11-01
  • 打赏
  • 举报
回复
商品超卖罢了 单台服务器直接加锁 比如两个用户同时购买,两个线程几乎同时查询库存,结果当然是够的,所以这个校验被绕过去没起作用 可以考虑库存表做乐观锁,如果没有更新库存成功那就重新获取库存校验数量(非分布式场景) 如果库存和订单不在一个数据库,那就得设计好流程了,比如先减库存,再创建订单,或者采用tcc,最终一致性等分布式事务的解决方案
  • 打赏
  • 举报
回复
将购买者排队: 消费者--》“购买者” :从“商品库存”里购买商品 生产者--》从“商品库存”提供“库存商品” “商品库存” :待消费的商品库存数量 “购买者队列” :将购买者入队,每次出队消费购买商品
[ 2021年,将Spring全家桶的课程进行Review,确保不再有顺序错乱等问题导致学员看不懂内容,进入2022年,将Spring的课程进行整理,整理为案例精讲的系列课程,并开始逐步增加高阶的Spring Security等内容,课件将逐步进行上传,敬请期待! ]本课程是Spring全家桶案例精讲课程的第二部分Spring MVCSpring案例精讲课程以真实场景、项目实战为导向,循序渐进,深入浅出的讲解Java网络编程,助力您在技术工作中更进一步。 本课程聚焦Java Spring的Web知识点,主要是关于Spring MVC的应用,包含:表单的增删改查、国际化、过滤器、拦截器、日志Log4j2及slf4j的使用、主题更改网站皮肤及样式、文件上传等的案例讲解,并且最后以一个SSM(Spring+Spring MVC+Mybatis)贯穿前后台的案例作为Spring MVC课程的终奖, 从而使大家快速掌握Spring的基础核心知识,快速上手,为面试、工作等做好充足准备。 由于本课程聚焦于案例,即直接上手操作,对于Spring的原理等不会做过多介绍,希望了解原理等内容的需要通过其他视频或者书籍去了解,建议按照该案例课程一步步做下来,之后再去进一步回顾原理,这样能够促进大家对原理有更好的理解。 【通过Spring全家桶,我们保证你能收获到以下几点】 1、掌握Spring全家桶主要部分的开发、实现2、可以使用Spring MVCSpring Boot、Spring Cloud及Spring Data进行大部分的Spring开发3、初步了解使用微服务、了解使用Spring进行微服务的设计实现4、奠定扎实的Spring技术,具备了一定的独立开发的能力  【实力讲师】 毕业于清华大学软件学院软件工程专业,曾在Accenture、IBM等知名外企任管理及架构职位,近15年的JavaEE经验,近8年的Spring经验,一直致力于架构、设计、开发及管理工作,在电商、零售、制造业等有丰富的项目实施经验 【本课程适用人群】如果你是一定不要错过!  适合于有JavaEE基础的,如:JSP、JSTL、Java基础等的学习者没有基础的学习者跟着课程可以学习,但是需要补充相关基础知识后,才能很好的参与到相关的工作中。 【Spring全家桶课程共包含如下几门】 

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧