网上订票,防止更新出现错误,写的代码总有点不放心
Statement stmt = connection.createStatement(
            ResultSet.TYPE_SCROLL_INSENSITIVE,
  ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(
        "SELECT TICKETNUM FROM DB_MOVIE_TICKET  WHERE  TICKID="
      + tickid );
rs.absolute(1);
if (rs.getInt("TICKETNUM") < 2)//每次订两张
   throw new SQLException("电影票已经被订购完");
rs.updateLong("TICKETNUM", rs.getInt("TICKETNUM")-2);
rs.updateRow();在SQL语句中加上“for update” 后变的好慢啊,而且最后一句
rs.updateRow();走不过去:(

解决方案 »

  1.   

    1. 建议使用TYPE_SCROLL_SENSITIVE,而不是TYPE_SCROLL_INSENSITIVE,或者同步synchronize订票方法
    2. 
    if (rs.getInt("TICKETNUM") < 2)//每次订两张
       throw new SQLException("电影票已经被订购完");
    rs.updateLong("TICKETNUM", rs.getInt("TICKETNUM")-2);
    改为
    int nCount = rs.getInt("TICKETNUM") ;
    if (nCount < 2)//每次订两张
       throw new SQLException("电影票已经被订购完");
    rs.updateLong("TICKETNUM", nCount -2);
    这样少读了一次数据库
    3.sql中for update只用于触发器的创建与数据库游标的创建啊,与你现在的操作没有关系.
      

  2.   

    我不晓得具体怎么做,但是我晓得这绝不是个简单的问题,
    至少你需要一个更新票数的方法,而这个方法至少是synchronized的,
    而且不能直接读取数据库,应该有一个数据缓冲区,以队列的方式存在,每次只能有一个票数更新的数据从缓冲去取出,这是才能操作数据库,并且这个队列的操作方法也是synchronized