案例说明:火车票售票系统
同时启动多个线程模拟买票
窗口首先查询出还剩余多少张票,判断是否足够,再进行更新操作
所以是一条select语句,一条update语句现在出现的问题:
第一个人买首先查询剩余20张,买了2张,update为18张
第二个人在update之前就读出了,所以他读出的剩余票数也是20张,买了2张,update为18张结果买了4张,确只减少了2张请问如何解决这个问题呢?

解决方案 »

  1.   

    这个我记得是用程序段的线程同步来进行控制的,数据库进行控制,理解过可以用SELECT FOR UPDATE来进行控制,实际没有应用过,
      

  2.   

    你的意思是用synchronized来加锁是吧?
      

  3.   

    是的,记得还有视频专门讲这个例子的,ORACLE数据库端控制的话,
    可用SELECT 票数 FOR update进行加锁....
      

  4.   

    --使用for update手工加锁,加锁成功则继续,否则只能等待
    select name,amount from tickets where name='aaa' for update;
    --售票更新
    update tickets set amount=amount-2 where name='aaa'
    --提交释放锁
    commit;
      

  5.   


    不用for update,把事务隔离级设成可串行化。
    然后
    select ***
    update ***
    两者合一起构成一事务,
    这样应该不会出现脏读。
      

  6.   


    oracle的for update真是不错