setAutoCommit(false)导致读不到数据

本文探讨了在Java中使用MySQL数据库时,如何通过设置Connection的AutoCommit属性为False及不同的事务隔离级别来影响数据读取行为。特别关注了当外部工具(如Navicat)在事务期间修改数据时,这些设置如何影响查询结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果把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.         } 

 



本文转自 dogegg250 51CTO博客,原文链接:http://blog.51cto.com/jianshusoft/765736,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值