减票

来源:12-22 选座成功后批量扣减影响到的多个库存

从入门到放弃第0天

2023-05-26

假设:A车的起点为重庆,终点为北京,经过浙江和上海和天津。
重庆的战续为0,浙江是1,上海是2,天津是3,北京是4;
就有4+3+2+1=10种卖票情况,取其中一种,浙江到天津。
所以在daily_train_ticket表中记录:(只取了重要字段)
start start_index end end_index
浙江 1 天津 3
如果:在浙江到天津这种卖票情况中卖出一个座位。那会影响到10种卖票情况中的哪些呢?
卖票的10种情况:
0–1, 0–2, 0–3, 0–4;
1–2, 1–3, 1–4;
2–3, 2–4;
3–4;
其实很简单:起点小于 天津(3)and 终点 大于 浙江(1)
此时我们卖掉的是1–3;用上面的条件,条件来一个一个尝试,看会影响到哪些情况;
影响到的情况:0–2,0–3,0–4, 1–2, 1–4, 2–3,2–4 。
未影响到的情况:0–1, 3–4;(下站了座位就腾出来了)
所以简写sql语句:
update daily_train_ticket set 某某座位=某某座位-1 where start_index < endIndex and end_index > startIndex;
但是这里还有一个问题,就是1–3本身的座位数也要减1.
即:update daily_train_ticket set 某某座位=某某座位-1 where date = date and train_code = trainCode and ((start_index < endIndex and end_index > startIndex)or (start_index = startIndex and end_index = endIndex ) );
老师你看一下,这是我的想法,是个新手,刚学几个月。你帮忙找找漏洞,或者提提意见。谢谢哈

写回答

1回答

甲蛙

2023-05-27

你提到:影响到的情况:0–2,0–3,0–4, 1–2, 1–4, 2–3,2–4 

这个不准确,如果这个座位0-1之前已经卖出去了,这次卖1-3,就不能影响0–2,0–3,0–4的库存,因为0–2,0–3,0–4的库存在卖出0-1时就已经影响了。

你只考虑了有交集的区间,还要加一个条件:没卖过票。总体就是:没卖过票的且有交集的区间,库存-1

可以再看下“2-3 如何保证不超卖、不少卖,还要能承受极高的并发?”关于减库存的分析

3
1
从入门到放弃第0天
嗯嗯,谢谢老师
2023-05-27
共1条回复

新版Springboot3.0打造能落地的高并发仿12306售票系统

最新版Spring3.0仿12306售票系统实战

852 学习 · 512 问题

查看课程