|
|
|
|
|
|
B*****g 发帖数: 34098 | 1 【 以下文字转载自 Programming 讨论区 】
发信人: qxc (法界闲人), 信区: Programming
标 题: 学习了学习了!数据库火车票的高效并发实现
发信站: BBS 未名空间站 (Sun Feb 9 01:58:51 2014, 美东)
带了一天 2个娃, 简直不是人干的事情。。。
废话少说, 直接上干货。
前面我们的数据库, 都有个思维陷阱 -- 吧数据库当 java/C 了。 设立了各种和车
站车次物理模型符合的数据结构, 弄得各种不爽, 而且无法并发 - 卖一个站, 这个
站相关的所有其他票都受影响。
下面直接上简化的 psudo code. 大家都是聪明人,其他部分脑补。 这个办法的各种
log(n),甚至 o(1) 效率是很明显的。
tickets
{
id
trainid
start
end
type
transaction_id // null if unsold.
duration ( ==end - start) // 选座优化用
}
比如 车次 X 从 s0 .... s19. 那么一开始 3000 张票, 从 0 到 19.
售出交易id = null
有人买一张从0 到19 的全程票,
start transaction
select top 1 ticket where start <= request.start and end >= request.end and
transactionID = null
update tickets transactionID = ABCD where id = zzzz
这张票就卖了。自动从以后交易消失
===》 关键的是,现在有人要买, 比如 s5 到 s12 的票
select top 1 ticket where start <= request.start and end >= request.end and
transactionID = null order by duration asc
这样前 N 张是最优。 根据其他条件, 比如start == request.start 优先之类选一张
mark transactionid. 中途加车厢之类的由于长度优化会被优先自动使用。
!!!!! 然后!!!!
根据前面交易, 将会产生 0 到 2 张新票! 这个是关键。 以票为本, 彻底忘记车站
这些玩意。这样产生0-2 张新票。前面碎片一张, 后面一张。
这个买票个产生新票作为一个 transaction, 保证无丢票重票。
其他各种优化都变得非常容易, 大家脑补。 而且票独立,可以大量 core 并发。 | d****n 发帖数: 12461 | 2 sql有write lock没有read lock啊,这个方法行不通。
start transaction
select top 1 ticket where start <= request.start and end >= request.end and
transactionID = null
这里很恐怖。很有可能出现1000个座位4000个乘客的问题。
update tickets transactionID = ABCD where id = zzzz
【在 B*****g 的大作中提到】 : 【 以下文字转载自 Programming 讨论区 】 : 发信人: qxc (法界闲人), 信区: Programming : 标 题: 学习了学习了!数据库火车票的高效并发实现 : 发信站: BBS 未名空间站 (Sun Feb 9 01:58:51 2014, 美东) : 带了一天 2个娃, 简直不是人干的事情。。。 : 废话少说, 直接上干货。 : 前面我们的数据库, 都有个思维陷阱 -- 吧数据库当 java/C 了。 设立了各种和车 : 站车次物理模型符合的数据结构, 弄得各种不爽, 而且无法并发 - 卖一个站, 这个 : 站相关的所有其他票都受影响。 : 下面直接上简化的 psudo code. 大家都是聪明人,其他部分脑补。 这个办法的各种
|
|
|
|
|
|
|