如果把Connection的AutoCommit设为False,两次executeQuery之间,通过其它途径(我通过Navicat)修改了status值为1,第二次executeQuery依然把那条数据读出来了,也就是说,我在Navicat中的操作就像没有发生一样,需要重新连接或者con.commit()一下才能读到。猜测可能是事务的隔离级别造成的。

 con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

不允许脏读,果然OK了,这种情况平时还是要注意一下的

 
  
  1. Connection con = DriverManager 
  2.         .getConnection( 
  3.                 "jdbc:mysql://localhost/spider?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true"
  4.                 "root""111111"); 
  5.             con.setAutoCommit(false); 
  6.              
  7.          
  8.         Statement stmt = null
  9.         ResultSet rs = null
  10.         try { 
  11.             stmt = con.createStatement(); 
  12.              
  13.             rs = stmt.executeQuery("select * from queue where status=" 
  14.                     + String.valueOf(0)); 
  15.             while (rs.next()) { 
  16.                 String url = rs.getString("url"); 
  17.                 System.out.println(url); 
  18.             } 
  19.  
  20.  
  21.         } catch (SQLException e) { 
  22.             e.printStackTrace(); 
  23.         } finally { 
  24.             if (stmt != null) { 
  25.                 try { 
  26.                     stmt.close(); 
  27.                 } catch (SQLException e) { 
  28.                     e.printStackTrace(); 
  29.                 } 
  30.             } 
  31.         } 
  32.          
  33.         Thread.sleep(15000); //等待的时候在navicat中修改数据的status=1
  34.  
  35.         System.out.println("next"); 
  36.          
  37.         try { 
  38.             stmt = con.createStatement(); 
  39.             rs = stmt.executeQuery("select * from queue where status=" 
  40.                     + String.valueOf(0)); 
  41.             while (rs.next()) { 
  42.                 String url = rs.getString("url"); 
  43.                 System.out.println(url); 
  44.  
  45.             } 
  46.  
  47.         } catch (SQLException e) { 
  48.             e.printStackTrace(); 
  49.         } finally { 
  50.             if (stmt != null) { 
  51.                 try { 
  52.                     stmt.close(); 
  53.                 } catch (SQLException e) { 
  54.                     e.printStackTrace(); 
  55.                 } 
  56.             } 
  57.         }