try {
    conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","userpwd";
    conn.setAutoCommit(false);//禁止自动提交,设置回滚点
    stmt = conn.createStatement();
    try{
        stmt.executeUpdate(“alter table …”); //数据库更新操作1
    }catch(Exception e1){}
    try{
        stmt.executeUpdate(“insert into table …”); //数据库更新操作2
    }catch(Exception e2){}
    conn.commit(); //事务提交
}catch(Exception ex) { 
        try {
        conn.rollback(); //操作不成功则回滚
    }catch(Exception e) {
        e.printStackTrace();
    }
    ex.printStackTrace();
}
我想知道的是:
try{
    stmt.executeUpdate(“alter table …”); //数据库更新操作1
}
发生异常的话,程序还会走到conn.rollback()上吗?

解决方案 »

  1.   

    看你这个代码是这样的:
    当alter发生异常的时候,什么都不会发生,因为你catch中什么也没有写。然后代码下移到insert
      

  2.   


        显然不会!    ///////////////////////////////////////////////////////////////////////////
        try{
            stmt.executeUpdate(“alter table …”); //数据库更新操作1
        }catch(Exception e1){}
        try{
            stmt.executeUpdate(“insert into table …”); //数据库更新操作2
        }catch(Exception e2){}
        ///////////////////////////////////////////////////////////////////////////
        
        stmt.executeUpdate(“alter table …”); //数据库更新操作1
        stmt.executeUpdate(“insert into table …”); //数据库更新操作2    这两处有可能发生的异常都已经被catch(Exception e1){}、catch(Exception e2){}捕获了,又没有被重新抛出,不管有没有发生都不会把异常传给上层    因此
        try{
            stmt.executeUpdate(“alter table …”); //数据库更新操作1
        }
        发生异常的不会使程序还会走到conn.rollback()上    ///////////////////////////////////////////////////////////////////////////
        conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","userpwd");
        conn.setAutoCommit(false);//禁止自动提交,设置回滚点
        stmt = conn.createStatement();
        ...
        conn.commit(); //事务提交
        ///////////////////////////////////////////////////////////////////////////
        
        如果上面的代码段发生异常,则会使程序还会走到conn.rollback()上
      

  3.   

    谢谢各位!还有一个问题:
    如果
        try{
            stmt.executeUpdate(“insert into table …”); //数据库更新操作2
        }catch(Exception e2){}
    发生异常,那么程序既没有执行commit也没有执行rollback,那是不是conn就不会被释放?
    上面的程序从优化的角度来讲存在那些问题。谢谢!