请教数据库多用户并发处理的问题?

Hunterdiary 2006-12-19 03:03:25
有个问题在脑海里萦绕了很久,也没有找到合理的答案,不知道大家对此问题有何良策?

假设某个航空售票系统,正在出售从上海到北京的机票,某日某时间某航班的机票只剩下一张,此时有A,B,C,D四个售票员同时看到了这张机票(根据数据库中的共享琐机制,这是个可能的),正巧,这个时候又来了四个旅客U1,U2,U3和U4,同时分别到了A,B,C,D四个柜台,同时要求这张机票!哈哈,没办法,事情就有那么的巧!

这个时候,我的问题就来了:
1。这个时候四个售票员同时向系统发出请求,系统根据排他琐机制,会不会造成四个请求同时等待,最终导致死锁!
2。假如A把这张票卖出去了,B,C,D该如何处理他们所看到的那张票?系统会给他们提示吗?说:给票已经售出!或类似这样的话吗?
3。假如四个售票员都可以卖出这张票,但这与事实不符!系统多售出了机票!倘若不能,
为什么?不是明明看到了一张吗?

...全文
689 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
taber 2007-01-14
  • 打赏
  • 举报
回复
看来你还不明白什么叫死锁,只有a等b,b又等a的情况下才是死锁
另外,你的问题是并发问题,这个oracle都替你解决好了,完全不用担心
如果你需要在一个事务中需要数据不被修改,加个排他锁就行了
qianjinrail 2007-01-13
  • 打赏
  • 举报
回复
遇到了同样的问题 在网上找答案 找到这来了
现在找到的最接近的答案是select for update 但仍没有解决问题 因为这个语句加的锁在事务结束后就会释放 而读取并显示和写回是属于两个事务 所以select for update加的锁在显示后就释放了
而在回写的时候把每个值的原值都在where中核对一下似乎有点麻烦 应该有更好的方法

期待高人给点提示。。。。
kingkingkingking 2006-12-22
  • 打赏
  • 举报
回复
等待中...
对不起,机票已经售完。
欢迎下次再来!
Hunterdiary 2006-12-22
  • 打赏
  • 举报
回复
根据楼上的说法,假如A把这张票卖出去了,那么B,C,D售票员都应该得到一个服务器的反馈信息了,提示这张票已经卖出去了,是这样的吗?
jdsnhan 2006-12-21
  • 打赏
  • 举报
回复
对于用户来说,是同时递交了,但对于oracle来说,不会的,队列里面,是有1234顺序的,没有并列第一的时候,嘿嘿。
icedut 2006-12-20
  • 打赏
  • 举报
回复
有个问题在脑海里萦绕了很久,也没有找到合理的答案,不知道大家对此问题有何良策?

假设某个航空售票系统,正在出售从上海到北京的机票,某日某时间某航班的机票只剩下一张,此时有A,B,C,D四个售票员同时看到了这张机票(根据数据库中的共享琐机制,这是个可能的),正巧,这个时候又来了四个旅客U1,U2,U3和U4,同时分别到了A,B,C,D四个柜台,同时要求这张机票!哈哈,没办法,事情就有那么的巧!

--
我们现在是重要的地方作更新的时候
会比对原纪录值
update ... where
where后面可能是表的所有字段比较
icedut 2006-12-20
  • 打赏
  • 举报
回复
你的帐户上有1000元,有两张卡,你和你老婆各拿一张卡同时各消费了100元,应该还剩800元。可是就这么巧,你的这台POS机先读出余额1000,减去你消费的100,这时你老婆的POS机也读出余额1000,减去她消费的100。然后你的POS机将新余额900写回,你老婆的POS机也将新余额900写回。哈哈,你的账户余额还有900,但你们共花掉了200.
--
银行会这个样子么
漏洞也太大了
肯定不会是写余额的
gss9999 2006-12-20
  • 打赏
  • 举报
回复
select for update就可以了,只有一个售票员可以卖这张票.
sungangsg 2006-12-20
  • 打赏
  • 举报
回复
没有这么麻烦,访问数据总有个前后,几微秒也是有间隔的,访问时标注为锁定,访问完再释放权限就行了,所以不推荐把数据全部取到客户端,做完修改,又全部存回数据库的操作,如DELPHI的clientdataset的组件要做的工作就比较多了
xb_feng 2006-12-19
  • 打赏
  • 举报
回复
DBMS中的事务机制会处理这些问题,当然你要正确的应用,你举了一个最简单的例子,更复杂的例子如下:

你的帐户上有1000元,有两张卡,你和你老婆各拿一张卡同时各消费了100元,应该还剩800元。可是就这么巧,你的这台POS机先读出余额1000,减去你消费的100,这时你老婆的POS机也读出余额1000,减去她消费的100。然后你的POS机将新余额900写回,你老婆的POS机也将新余额900写回。哈哈,你的账户余额还有900,但你们共花掉了200.

你是公司的会计,想统计一下这个月的工资总额,公司有十个人,每人工资1000元,应得结果10000元,你发出一个SUM指令,计算机开始一条一条的统计。这时一个部门经理想起这个月小张替小王顶了两天班,应该从小王的工资扣10元加给小张,于是将小王的工资减10元小张的工资加10元,但这时你的SUM指令已经统计过了小王的工资1000元,但还没有统计到小张的工资。SUM完了后,工资总额10010元,哈哈,错了。

这些问题均由数据库中的事务机制解决,多看看书吧
realx 2006-12-19
  • 打赏
  • 举报
回复
服务器收到请求的时间不可能是同时的.就算从时间上来说刚好是同时,数据库肯定也有相应机制来给这几个请求排个先后顺序的.

3,492

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧