1,顾客提出要买的票数为m 以及票的种类,怎么快速从ORACLE票表中选择出m张未售的票?(票表中有个是否已售的标志)
2,多个窗口同时卖票,当窗口A卖X张硬座票时,窗口B正要卖Y张硬座票,怎么保证窗口A,B选择出  的不是同一张票?如果A选票时对相应纪录进行加锁FOR UPDATE,B怎么去选择未加锁Y张票?
正在做数据库的一个课程设计。不胜感激!

解决方案 »

  1.   

    1.select * from t where 标志='未售' and rownum<=m;2.每个select都用for update nowait,如果被锁住,会返回错误提示,这样可以再找下一个记录。不知道这个方法好不好?
      

  2.   

    一旦某张票被调入某个售票窗口,这张票尽管没有销售,但其他窗口是不能再调用,只有等到该窗口取消该查询操作后,其他窗口才能再次查到,在火车站实际的售票厅中一张车票经常被十几个窗口同时请求,如果使用正在访问的标志,会使得整个系统性能下降,如果用for update skip locked,来解决,但如何取得输入的售票数量,如在购买3张票时,语句用rownum<=3 for update skip locked,但同时另外一个窗口如果也需要3张票rownum<=3 for update skip locked就无法查出记录?
    请各位高手指教
      

  3.   

    我觉得没必要一个人浏览的时候,其它人就不能销售了吧。感觉与事实不符不如大家都可以浏览,然后要订的时候再先select ..for update no wait,然后成功了再update
      

  4.   

    这应该是用java多线程的好时候吧
      

  5.   

    看实际需求. 通常来说同事查看是允许的. 这里仅仅是技巧的问题,不存在什么特别的.当需要购买的时候,再次查询可以购买的票,如果符合就for update,同事每台电脑都需要不停的刷新状态.
      

  6.   

    接口 java.sql.Connection 缺省情况下,在执行完每一个语句之后,Connection 自动地提交更改。如果禁止自动提交,必须进行显式的提交,否则将不保存对数据库的更改。 
    所以首先得设定为禁止自动提交,再恢复自动提交状态
    再update 表 set .... where 车次 = ..,日期 = ...  
    ---该条语句只为防止几个人等待操作同一张票而使别人先进行暂时性的等待,每个相同日期的同一车次得操作同一条记录,即同一票 表修改同一记录再resultset = select * from 票表 where 售票标志=未售(0)and 座位类型 =.. and rownum <= 票数
    -- 上条语句目的:返回需要的几张票的信息
    再update set 售票标志 = 正在售(1) where 售票标志=未售(0)and 座位类型 =.. and rownum <=票数
            ---上条语句将标志改为正售
    再commit;并设定为原来的自动提交状态如果乘客不要就:update 相应票表 set 标志=未售 where 票号 in 票号;
    如果售就:update 相应票表 set 标志=已售 where 票号 in 票号;个人感觉这样子不会出现几个人卖同一张票的问题
    当然火车站实际应用中肯定有非常棒的解决方案