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
