我现在准备做一个影院售票系统
现在就并发访问的数据同步问题很是头疼,不知道怎么做才最好,来坛子像各位朋友求助,希望多给建议,谢谢
场景描述:A、B两个售票终端,售票流程是先锁定座位,然后再售出座位。A端口和B端口同时售票时,我想用同步方法在业务流进行锁定,但是效率很低啊,耗时至少是没用同步锁的5倍,朋友们有没有更好的办法?数据库锁会不会效率高些?谢谢,我没有分了,就70分了,全部散了吧

解决方案 »

  1.   

    数据库本身就支持吧 oracle
      

  2.   

    你是B/S系统还是C/S系统?
      

  3.   

    数据库分为行锁和表锁,行锁一般都是for update,在事务中执行。保证事务原子性的
      

  4.   

    这样看可以解决不:你肯定有一张表来存储你的票资源,如果是采用的oracle数据库的话,解决方法:当你要买这张票的时候,先锁定这张票,select card from filemcard  where carno='当前要买的票' for update,
    然后进行你后面的其他操作,这样,当你锁定了这样卡后,其他窗口就不会再来买这张票了这样操作应该可以解决吧,希望对你有帮助
      

  5.   

    锁不仅提供了对写操作的排他性,(就是在一个线程对数据进行写操作的时候,不允许其他线程同时对同一数据进行写操作),也阻止或控制了对未完成修改的数据的读操作,也叫作未提交数据。也就是写前可读,写中不可读,写完可读;读前可写,读中不可写(我不清楚有没有读中概念,如果读是一个原子操作的话,就没有读中概念,也不存在读中不可写的问题),读完可写。再看下具体操作
    http://www.cnblogs.com/lingmaozhijia/articles/1339222.html
      

  6.   

    http://www.blogjava.net/loocky/archive/2006/11/15/81138.html!
      

  7.   

    在业务层加锁不可取现在主流的数据库都支持事务模式,加上悲观锁,更高级的不但有表锁定,还有行锁定使用COMMIT和ROLLBACK就可以了,没有必要那么麻烦!根据返回执行状态判断是否提交成功!金融级别的如ATM取款机的处理方式也不外乎这些
      

  8.   

    如果是B/S ,Oracle的话,用数据库锁吧,它本身就有这个功能了。它有行级锁和表级锁,可以满足需要了
      

  9.   

    我的数据库是MySQL,用数据库锁是不是效率很低下啊????
      

  10.   


    谢谢,但我的数据库是MySQL的,这个性能是不是还不如用synch***关键字呢?
      

  11.   


    不会的,MYSQL数据库,你要设置为InnoDB,不然不支持事务模式!对于效率的话,那就是鱼和熊掌,每个数据库都一样,包括Oracle,MSSQL等等!不推荐在业务层同步控制!如果程序有BUG,全盘都会当掉,效率要远远低
      

  12.   


    进入事务模式,COMMIT提交更新请求,如果执行成功则返回成功状态,如果失败就会ROLLBACK,回滚到执行前状态