框架: 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层首先判断了用户购买的数量是否大于剩余库存。如果小于等于,才可以购买。 要怎么样解决这个问题,请高手指点????
业务: 在多用户并发购买商品的时候,发现用户总的购买量>某商品的剩余库存。
比如某商品库存为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层首先判断了用户购买的数量是否大于剩余库存。如果小于等于,才可以购买。 要怎么样解决这个问题,请高手指点????
解决方案 »
- 新手求助:删除数据库语句~
- 建个jsp的论坛,2个G空间。申请哪个空间好?
- rs.getString("time");只能用一次为什么?
- jsp 静态url问题,做过的帮忙
- structs中是不是表单必须用<html:form>??
- 怎么运行servlet?高分
- 客户端脚本无法完成验证之后的提交,这是为什么,仁兄们帮帮我呗
- 请给我一些建议,JSP老手们,谢谢!!
- SmartUpload下载问题?
- 在javabean里面是不是可以这样写阿! request.getParameter("kkk");因为我的这个处理不想在jsp里面完成!谢谢了!
- Error creating bean with name 'itemMasterSe' defined in ServletContext resource
- java 计算统计问题
接着将请求放入队列中,按顺序请求,同时队列设置超时时间,一段
时间没处理,请自动移出队列,底层可以使用使用乐观锁
或者在上层使用原子,除此之外redis也有相关的接口可以操作。
单台服务器直接加锁
比如两个用户同时购买,两个线程几乎同时查询库存,结果当然是够的,所以这个校验被绕过去没起作用
可以考虑库存表做乐观锁,如果没有更新库存成功那就重新获取库存校验数量(非分布式场景)
如果库存和订单不在一个数据库,那就得设计好流程了,比如先减库存,再创建订单,或者采用tcc,最终一致性等分布式事务的解决方案
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加锁超时等等等等