在对数据库写编程时,事务控制是首先需要关注的问题。
第1点,弄清“自动提交”与“手工提交”方式下,事务提交的时机;
第2点,是确定采用自动事务提交方式,还是手动提交方式。
下面是对第1点的测试过程记录:
1.采用自动事务提交
public void insert(){
try{
con =JdbcUtil.getConnection();
for( int i=0; i<5; i++){
System.out.println("-----"+i);
stmt =con.createStatement();
sql ="INSERT INTO TEMP_ZDP2 values('aa',"+i+",'33',null,null)";
stmt.executeUpdate(sql);
}
}catch( Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close( rs);
JdbcUtil.close( stmt);
JdbcUtil.close( con);
}
}
在stmt.executeUpdate(sql);处设置断点
执行中发现,在每次执行完stmt.executeUpdate(sql);后,数据库中就插入了记录
2.采用手工提交,显式使用commit来提交数据
try{
con =JdbcUtil.getConnection();
con.setAutoCommit( false);
for( int i=0; i<5; i++){
System.out.println("-----"+i);
stmt =con.createStatement();
sql ="INSERT INTO TEMP_ZDP2 values('bb',"+i+",'33',null,null)";
stmt.executeUpdate(sql);
}
con.commit();
}catch( Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close( rs);
JdbcUtil.close( stmt);
JdbcUtil.close( con);
}
执行中发现,在每次执行完stmt.executeUpdate(sql);后,数据库中并没有插入记录,直到con.commit();后,库中才有数据生成。
3.采用手工提交,不使用commit
try{
con =JdbcUtil.getConnection();
con.setAutoCommit( false);
for( int i=0; i<5; i++){
System.out.println("-----"+i);
stmt =con.createStatement();
sql ="INSERT INTO TEMP_ZDP2 values('bb',"+i+",'33',null,null)";
stmt.executeUpdate(sql);
}
}catch( Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close( rs);
JdbcUtil.close( stmt);
JdbcUtil.close( con);
}
执行中发现,在每次执行完stmt.executeUpdate(sql);后,数据库中并没有插入记录,直到JdbcUtil.close( con);后,库中才有数据生成。