网上订票,防止更新出现错误,写的代码总有点不放心
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();走不过去:(
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();走不过去:(
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只用于触发器的创建与数据库游标的创建啊,与你现在的操作没有关系.
至少你需要一个更新票数的方法,而这个方法至少是synchronized的,
而且不能直接读取数据库,应该有一个数据缓冲区,以队列的方式存在,每次只能有一个票数更新的数据从缓冲去取出,这是才能操作数据库,并且这个队列的操作方法也是synchronized