有个问题在脑海里萦绕了很久,也没有找到合理的答案,不知道大家对此问题有何良策?假设某个航空售票系统,正在出售从上海到北京的机票,某日某时间某航班的机票只剩下一张,此时有A,B,C,D四个售票员同时看到了这张机票(根据数据库中的共享琐机制,这是个可能的),正巧,这个时候又来了四个旅客U1,U2,U3和U4,同时分别到了A,B,C,D四个柜台,同时要求这张机票!哈哈,没办法,事情就有那么的巧!这个时候,我的问题就来了:
1。这个时候四个售票员同时向系统发出请求,系统根据排他琐机制,会不会造成四个请求同时等待,最终导致死锁!
2。假如A把这张票卖出去了,B,C,D该如何处理他们所看到的那张票?系统会给他们提示吗?说:给票已经售出!或类似这样的话吗?
3。假如四个售票员都可以卖出这张票,但这与事实不符!系统多售出了机票!倘若不能,
为什么?不是明明看到了一张吗?

解决方案 »

  1.   

    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元,哈哈,错了。这些问题均由数据库中的事务机制解决,多看看书吧
      

  2.   

    select for update就可以了,只有一个售票员可以卖这张票.
      

  3.   

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

  4.   

    有个问题在脑海里萦绕了很久,也没有找到合理的答案,不知道大家对此问题有何良策?假设某个航空售票系统,正在出售从上海到北京的机票,某日某时间某航班的机票只剩下一张,此时有A,B,C,D四个售票员同时看到了这张机票(根据数据库中的共享琐机制,这是个可能的),正巧,这个时候又来了四个旅客U1,U2,U3和U4,同时分别到了A,B,C,D四个柜台,同时要求这张机票!哈哈,没办法,事情就有那么的巧!--
    我们现在是重要的地方作更新的时候
    会比对原纪录值
    update ... where
    where后面可能是表的所有字段比较
      

  5.   

    没有这么麻烦,访问数据总有个前后,几微秒也是有间隔的,访问时标注为锁定,访问完再释放权限就行了,所以不推荐把数据全部取到客户端,做完修改,又全部存回数据库的操作,如DELPHI的clientdataset的组件要做的工作就比较多了
      

  6.   

    对于用户来说,是同时递交了,但对于oracle来说,不会的,队列里面,是有1234顺序的,没有并列第一的时候,嘿嘿。
      

  7.   

    根据楼上的说法,假如A把这张票卖出去了,那么B,C,D售票员都应该得到一个服务器的反馈信息了,提示这张票已经卖出去了,是这样的吗?
      

  8.   

    遇到了同样的问题 在网上找答案 找到这来了 
    现在找到的最接近的答案是select for update 但仍没有解决问题 因为这个语句加的锁在事务结束后就会释放 而读取并显示和写回是属于两个事务 所以select for update加的锁在显示后就释放了 
    而在回写的时候把每个值的原值都在where中核对一下似乎有点麻烦 应该有更好的方法 期待高人给点提示。
      

  9.   

    看来你还不明白什么叫死锁,只有a等b,b又等a的情况下才是死锁
    另外,你的问题是并发问题,这个oracle都替你解决好了,完全不用担心
    如果你需要在一个事务中需要数据不被修改,加个排他锁就行了