各位大虾:
    我想设计一个网上订票系统,我想请教:如何控制数据并发访问和修改的问题?
    如:
    操作员a查询没有被预订的车票信息,假设查询到了A1,A2,A3这三张票。
    同时,操作员b 也在查询没有被预订的车票信息,结果也是A1,A2,A3。
  
    操作员a想预定A2这张票,于是点了“预定”按钮;
    几乎同时,操作员b也想预定A2这张票,于是也点了“预定”按钮;
    (预定操作:UPDATE一条记录的一个字段)    请问此时:我如何处理这种并发修改问题?
              这两个用户几乎同时UPDATE同一条记录。
              用锁吗?
  
    请赐教!
    多谢

解决方案 »

  1.   

    不需要用锁,在update时带上条件,如表的结构中有个字段A,空表示没有人预订,预订时填入预订人的编号,那么预订语句是
    update TABLENAME set A=编号 where ID=查询到的ID and A is null;
    执行完update后判断影响的行数,如果行数是1表示预订成功,0表示不成功。
      

  2.   

    直接建一个表 ticket_lockid,ticket_id,operator_id,lock_time,note流水号,票号,操作员,时间,描述在操作员点击预订的时候,插入一条记录到ticket_lock.在另一个操作员点击预订的时候,需要判断是否在ticket_lock已有记录。在确认后,将ticket_lock的记录提交到订单关系表,并删除lock记录。如果取消预订,则只删除lock记录
      

  3.   

    谢谢     bobfang(匆匆过客) 
             nicolas1999king(恋伶)
    请教 :  nicolas1999king(恋伶)
            “在另一个操作员点击预订的时候,需要判断是否在ticket_lock已有记录。”
             这就是说 :插入ticket_lock之前先需select
             如果 select时另外一个人执行了insert,就会出现一张票被重复预定的情况。
             对吗 ?       
      

  4.   

    请教高人,如果十几个人(可能更多)同时单击预订,在事务内部还可能做些其他操作,update后,但是事务未回滚,别的事务可能也update了,会不会有问题.
      

  5.   

    应该不可能的,你update时是对表加锁的,其它的事务要用到这个表,只能等待你的事务锁解放了才行,所以不会有你这样的问题。
      

  6.   

    两种方式:
    1、悲观封锁
       在update前,先select xxxx from xxx for update nowait;
    2、乐观封锁
       在update前先查出需要被更新记录的所有字段值,然后
       update xxx set xxx=xx where col1=xx,col2=xx,col3=xxx .....
      

  7.   

    可以用timestamp来校验是否被更新吗?
      

  8.   

    select xxxx from xxx for update nowait;