车票表:

(车次, 区间, 已售)

(1024, [1,2], 0)

(1024, [1,2,3], 0)

(1024, [1,2,3,4], 0)

(1024, [2,3], 0)

(1024, [2,3,4], 0)

(1024, [3,4], 0)

主键是自增字段,给"车次"字段添加索引.

优化并发时,可以考虑根据"出发日"或"车次"进行分表分库.

区间[1,2,3]的含义是:从车站1上车,经过车站2,到车站3下车.

如果要给不同的区间配置不同的出票限额,那么可以再添加一个"限售"字段.

购票逻辑:

例如用户购买区间[2,3,4]的票时,

程序找出包含[2,3,4]的区间如[1,2,3,4]已售的票,

以及[2,3,4]包含的子区间如[2,3]和[3,4]已售的票,

如果三者的票合计小于500(这里假设列车满载为500人),

则用户能够购票,即[2,3,4]这个区间已售的票数+1.

SQL购票逻辑如下(以MySQL为例):

SET AUTOCOMMIT=0;

BEGIN WORK; --开启事务

select 已售 from 车票表 where 车次=1024

and 区间 in ('2,3,4', '2,3', '3,4', '1,2,3,4') for update;

update 车票表 set 已售=(已售+1) where 车次=1024 and 区间='2,3,4';

COMMIT WORK; --提交事务

SET AUTOCOMMIT=1;

其中 select for update 的作用是读上锁(对读出的行上写锁),依赖事务.

上述购票逻辑,关键在于找到where条件in中的区间,步骤如下:

1.找出包含一个区间如[2,3,4]的其他区间:

select 区间 from 车票表 where 车次=1024 and 区间 like '%2,3,4%';

在本例中得到:

[1,2,3,4]

2.找出一个区间如[2,3,4]里的子区间算法(以PHP为例):

function foo(array $arr, array &$tmp) {

$size = count($arr);

if($size == 1) return;

for($i=2;$i<=$size;$i++) {

$tmp[] = array_slice($arr, 0, $i);

}

array_shift($arr);

foo($arr, $tmp);

}

$arr = array(2,3,4);

$tmp = array();

foo($arr, $tmp);

var_export($tmp);

在本例中得到:

[2,3]

[2,3,4]

[3,4]

退票逻辑比购票逻辑简单得多,直接给对应车次,对应区间的已售车票-1即可:

update 车票表 set 已售=(已售-1) where 车次=1024 and 区间='2,3,4';

余票查询逻辑:

例如查询车次1024上区间[2,3,4]的余票:

select 已售 from 车票表 where 车次=1024

and 区间 in ('2,3,4', '2,3', '3,4', '1,2,3,4');

用500减去上述区间已售车票的和就是区间[2,3,4]上的余票.

这里假设列车满载为500人.

座位分配逻辑:

一列火车,其座位都是固定的,存储每列火车的座位的数据表没什么可说的.

至于座位分配,可以在车票表里增加一个"已售座位"的字段.

用户成功购票时,从"待售座位"中取一个分配给用户并更新"已售座位"字段.

"待售座位"为"所有座位"去掉相关区间"已售座位"后的座位.

SET AUTOCOMMIT=0;

BEGIN WORK; --开启事务

select 已售,已售座位 from 车票表 where 车次=1024

and 区间 in ('2,3,4', '2,3', '3,4', '1,2,3,4') for update;

update 车票表 set 已售=(已售+1), 已售座位=CONCAT(已售座位,分配座位)

where 车次=1024 and 区间='2,3,4';

COMMIT WORK; --提交事务

SET AUTOCOMMIT=1;

其中CONCAT相比直接赋值,能够减少传递给MySQL的数据. 车票表中"已售座位"字段存储"座位编号". 座位表: 座位编号, 列车, 车厢, 座位

php mysql购票_用PHP+MySQL实现12306购票和退票以及余票查询逻辑相关推荐

  1. php购票排位_用PHP+MySQL实现12306购票和退票以及余票查询逻辑

    普通商品的库存之间没有关联性,库存量都是确定的. 火车票跟普通商品不同,同一车次不同路段的车票的库存可能会相互影响. 所以数据库中不应存储某个车次某个路段的余票数量,而应存储该车次该路段已售的车票数量 ...

  2. mysql猎豹_猎豹网校MySQL数据库

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 猎豹网校MySQL数据库 链接:http://pan.baidu.com/s/1i3wyPjn 密码:qxhm 教程目录 第1章 了解SQL 1.1 数据 ...

  3. 阿里 MySQL 规约_阿里手册 Mysql 数据库规约

    (一)建表规约 1. [强制]表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否). 说明:任何字段如果为非负数,必须是 u ...

  4. .net连接mysql数据_.net连接MYSQL数据库的方法及示例!

    连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...

  5. 怎么重启网站mysql数据库_如何重启MySQL数据库服务

    服务器的启动和停止 停止:net stop mysql 启动:net start mysql -------------------------mysql mode相关问题-------------- ...

  6. linux c mysql 封装_本人对MYSQL C API做的一个封装,希望对linux C++程序员有点帮助,同时欢迎拍砖!...

    本人对MYSQL  C API做的一个封装,使用很简单,构造一个对象,就可直接执行SQL,但对于需返回结果的查询语句,对其数据集没做封装,仍需直接调用mysql c api对其进行处理,本人将下次完成 ...

  7. 无法为您重置MySQL密码_无法重置MySQL的root密码

    问题描述 我需要重置本地mysql安装的root密码,但不会让我.我已经试过了: $ sudo /etc/init.d/mysql stop * Stopping MySQL database ser ...

  8. mysql 客户端_技术分享 | MySQL 客户端连不上(1045 错误)原因全解析

    作者:Carlos Tutte.Marcos Albe 翻译:管长龙 在我们学习 MySQL 或从事 MySQL DBA 工作期间,时常会遇到:"我尝试连接到 MySQL 并且收到1045 ...

  9. mysql 实验_实验二 MySQL 实验.doc

    实验二 MySQL 实验 实验二 MySQL数据库操作实验 实验目的: 掌握MySQL数据库的安装方法 掌握MySQL数据库的使用 熟悉数据库管理工具的使用 实验要求: 利用MySQL命令创建数据库和 ...

最新文章

  1. 对 makefile 中 .SECONDARY 的学习体会
  2. 完整代码+实操!手把手教你操作Faster R-CNN和Mask R-CNN
  3. svn 413 Request Entity Too Large 错误
  4. Fact Table and Dimension Table In My Opinion
  5. 不能以根用户身份运行 Google Chrome 浏览器
  6. 前端学习(623):交换两个变量的值
  7. SQLIntegrityConstraintViolationException: 异常解决
  8. python有几大模块_Python的几个常用模块
  9. 如何从程序员到架构师?
  10. git报错:ssh variant 'simple' does not support setting port解决
  11. 总结帖:“深度解析:清理烂代码”
  12. iOS DevCamp Android DevCamp 课程集锦 为最喜爱的课程投票 获得CSDN社区会员专享特惠票...
  13. 电脑上有哪些特别好用的小工具?盘点4个PC工具,个个都精品
  14. [深度学习项目] - 时间序列预测 (2)
  15. 威廉玛丽学院计算机专业好吗,威廉玛丽学院计算机硕士语言要求请问在哪
  16. 在网页中点击链接就可以和在线好友QQ聊天
  17. 2020年计算机二级报名时间上半年,2020年上半年计算机二级报名时间是什么时候...
  18. 作业二 20182325袁源
  19. Http请求全过程简述
  20. 印光法师:《灵岩遗旨》壹、悲化有情

热门文章

  1. vs2019 安装resharper_VS2019已还原ReSharper的功能
  2. noi.openjudge_P8787数的划分
  3. 查询淘宝商品历史价格(用Python记录商品每天价格变化)
  4. Spark 部署 Standalone 模式
  5. 【DLX】 hdu3498 whosyourdaddy
  6. 百度小程序需要服务器吗,如何搭建百度小程序,搭建百度小程序方法
  7. Android-设置PullToRefresh下拉刷新样式
  8. 重构条件-Decompose Conditional分解条件式一
  9. 输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
  10. 2018年末施瓦辛格热血演讲《关于成功·成功的真谛》—YouTuBe播放量超1个亿!盘它!