java - 关于买票系统的一点疑问
PHP中文网
PHP中文网 2017-04-18 10:23:42
[Java讨论组]

我用ssm设计一个买票系统,在取票数余量时有些疑问,如果a,b两个用户同时请求那么得到的余票数应该是相同的,那购买程序完成后余票数上就会有出入,通常又是如何保证这种并发状态下读取数据库的数据准确性问题,先行谢过,菜鸟求科普。

PHP中文网
PHP中文网

认证0级讲师

全部回复(7)
怪我咯

并发的话,不是用队列来做吗?

PHP中文网

也可以使用锁机制,最简单就是 for update,进行行锁

迷茫
  1. HTTP是无状态的,如果2个同时刷新获取的余票是一致的,但是购买时服务器需要校验余票

  2. 虽然前台可以多个用户同时操作,但是在扣除余票确是一个线性操作,你不可能让多个人同时对一个数做减减操作,因为这样可能你最后卖出去的票多余实际的总票数

可以参考一下上图。

组1:多个用户同时购买但是扣除余票的操作是线性的
组2:多个用户同时购买,但是提前将票分在不同的窗口中,换句话说每个窗口卖的票数之后等于总票数,如果其中一个窗口的票卖完了就得更换窗口买票(当然这得具体看你服务端的逻辑设计了,你也可以像其它窗口先挪一些票,但是票的总数是不变化的)

这其实很像HashtableConcurrentHashMap的关系。
不过这两种的选择还得根据实际业务场景来啦,如果是卖火车票的话,第二种就不太好使。
当然如果你不是卖火车票的话其实第一种已经可以满足目前大多数卖票场景了。

PHP中文网

查归查, 买归买, 你查了, 结果在那停一天, 也要帮你挂起一天吗

PHP中文网

用锁或队列,都是使用串行机制实现。一般来说并发量不高时,不用处理,可以在下单时验证。

ringa_lee

数据用锁,代码加事务,并发还要降低数据库的直接操作

PHP中文网

这么跟你说吧,12306其实他也只是考虑了一点,你在逛12306时,停留时间稍微长一点,他会让你强制刷新,你可以参考一下,还有就是各家商城的抢购,道理是一样的

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号