rs.next()为false

xiaoxiao2021-02-28  48

1、描述问题

  使用jdbc 连接数据库,这本来是十拿九稳的小题目,可是遇到一个从来没有遇到的问题while()循环怎么也进不去   rs.next()为false

public List<Dcustmsg> selectAll() { Connection con=null; PreparedStatement pstmt=null; ResultSet rs=null; try{ con=JdbcUtils.getConnection(); pstmt = con.prepareStatement("select id_no , phone_no from dCustMsg"); rs=pstmt.executeQuery(); List<Dcustmsg> list = new ArrayList<Dcustmsg>(); while(rs.next()){ //每次取出一行放入list   Dcustmsg dcustmsg = new Dcustmsg(); String id_no = rs.getString(1); String phone_no = rs.getString(2); dcustmsg.setId_no(id_no); dcustmsg.setPhone_no(phone_no); list.add(dcustmsg); } return list; }catch(Exception e){ throw new RuntimeException(e); }finally{ JdbcUtils.close(rs, pstmt, con); } }

  在数据库那边插入的数据,没有问题  ,select  语句可以正常执行 ,驱动也没有问题,可是就是没有数据。把sql/developer关了,重启之后发现可以去除数据了。关之前记得

  点了下提交,就想是不是因为没有提交的原因啊 。想到以前做项目的时候没有写过commit 啊 ,是什么原因呢?

2、解决问题

      在网上找了一些资料,意思是Oracle有隐式提交这项功能。事务可以保持数据的一致性

      我们一般,在sql*plus 开两个会话 ,我们如果在会话一的事务没有提交时,会话二不能查看到会话一的修改数据。

      会话一:

     update product set desperation = 'a' ;

     insert into product values('#','#','#','#');

      在会话二 :

      查询时 ,发现 product 表的 desperation 的值没有变

      如果我们想保持数据的一致性,必须commit .

     但是我们有的时候不commit 也会发现数据是一致的。

    比如

   1、一条DDL或者DCL语句

       1)DDL包括create,alter,drop,truncate,rename。

       2 )  包括grant,revoke。

   2、用户退出SQL Developer或者SQL*Plus    3、系统崩溃

    这就是隐式提交!!!!!

     当系统正常时,执行DML,想要结束事物需要COMMIT或者Rollback;当执行DCL时,事物就会自动提交。 为了避免隐式的提交或者回滚,尽量保证一条或者几条DML操作完成后有显示的提交或者回滚,防止后续继续执行DCL或者DDL时自动提交前期的DML操作。

引用以上文章链接http://www.linuxidc.com/Linux/2013-11/92704.htm

转载请注明原文地址: https://www.6miu.com/read-82249.html

最新回复(0)