关于买票系统的一点疑问

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

阅读 3.8k
7 个回答

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

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

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

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

图片描述

可以参考一下上图。

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

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题