由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 学习了学习了!数据库火车票的高效并发实现 (转载)
相关主题
问个Index的问题请教怎么来log duration of a MYSQL procedure?
求助:找出现2次及以上的记录如果你不喜欢老土, 看看这个
求助:sql, count, group by, unionQuestions on SQL
请教三个Key的property,Re: [转载] what's the equivalent of 'minus' (oracle) in access?
请问isolation level "read comitted"和"serializable"的区别。Can someone tell me price of whole set of GemStone?(NULL)
【转载】大家来讨论Urgent help needed, please
怎么写这个query呢?where can I download SQL Sever? thanks (null)
今天去面试county的职位merge 同步复制
相关话题的讨论汇总
话题: start话题: null话题: 并发话题: 新票
进入Database版参与讨论
1 (共1页)
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. 大家都是聪明人,其他部分脑补。 这个办法的各种

1 (共1页)
进入Database版参与讨论
相关主题
merge 同步复制请问isolation level "read comitted"和"serializable"的区别。
ORA-01400 and ORA-06512【转载】大家来讨论
How to concatenate NULL value with a string in SQL Server?怎么写这个query呢?
Re: How to concatenate NULL value with a string in SQL Server?今天去面试county的职位
问个Index的问题请教怎么来log duration of a MYSQL procedure?
求助:找出现2次及以上的记录如果你不喜欢老土, 看看这个
求助:sql, count, group by, unionQuestions on SQL
请教三个Key的property,Re: [转载] what's the equivalent of 'minus' (oracle) in access?
相关话题的讨论汇总
话题: start话题: null话题: 并发话题: 新票