在JDBC中怎样将多个SQL语句组合成一个事务呢?在JDBC中,打开一个连接对象Connection时,缺省是auto-commit模式,每个SQL语句都被当作一个事务,即每次执行一个语句,都会自动的得到事务确认。为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之后,如果不调用commit()方法,SQL语句不会得到JDBC事务处理确认。在最近一次commit()方法调用之后的所有SQL会在方法commit()调用时得到确认。
private static void test() {
Connectioncon=db.getConn();
PreparedStatementpstmt=null;
ResultSetrs=null;
try{
con.setAutoCommit(false);
Stringsql1="update teststu set gongzi=gongzi-10 where name='hj'";
pstmt=con.prepareStatement(sql1);
pstmt.executeUpdate();
Stringsql2="select gongzi from teststu1 where name='hh'";
pstmt=con.prepareStatement(sql2);
rs=pstmt.executeQuery();
intgongzi=0;
if(rs.next()){
gongzi=rs.getInt("gongzi");
}
if(gongzi>300){
thrownew RuntimeException("工资超额,不能再加.");
}
Stringsql3="update teststu set gongzi=gongzi+10 where name='hh'";
pstmt=con.prepareStatement(sql3);
pstmt.executeUpdate();
con.commit();
System.out.println("进行事务提交.");
}catch(SQLExceptione){
try{con.rollback();
}catch (SQLException e1) {e1.printStackTrace();}
e.printStackTrace();
}finally{
}System.out.println("执行结束.");
}
为什么要使用事务中的rollback()?
疑问:
事务如果设置成手动提交的话,那么如果commit不执行的话数据库中的内容就不会改变,为什么还要用到回滚呢,因为不用回滚只要commit
会执行那么数据库就不会改变。
回答:
因为数据库的执行了sql语句然后报错导致事务不能进行commit的话,虽然数据库不会改变,但是数据库中有个缓存空间space在,它会在事务还未提交之前把更新的sql语句以及更新后的结果缓存在space中,等到commit操作后进行修改数据库,如果隔离级别比较低的话那么就会读取未提交sql中的数据内容,那么就会导致结果不正确了,故要回滚,把space中的内容还原到最初的位置