dml语句写在事务里面,看下面的例子,注释处添加事务,我没理解,应为直观上看不出来,各位帮解释下啊?import java.sql.*;
public class Transaction {

public static void main(String[] args) {
Connection co = null;
Statement st = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
co = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:myora1", "scott", "tiger");
// co.setAutoCommit(false);
st = co.createStatement();
st.executeUpdate("insert into pme(empno,ename) values(100,'xxx')");

int x = 9/0;

st.executeUpdate("insert into pme(empno,ename) values(200,'yyy')");
// co.commit();
// co.setAutoCommit(true);
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
// try{
// co.rollback();
// co.setAutoCommit(true);
// }catch(SQLException e1){
// e1.printStackTrace();
// }
}finally{
try{
             if(st != null){
             st.close();
             st = null;
                }
                if(co != null){
                 co.close();
                 co = null;
                }
            }catch(SQLException e){
             e.printStackTrace();
            }
}
}}

解决方案 »

  1.   

    import java.sql.*;
    public class Transaction {
        
        public static void main(String[] args) {
            Connection co = null;
            Statement st = null;
            try{
                Class.forName("oracle.jdbc.driver.OracleDriver");
                co = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:myora1", "scott", "tiger");
               co.setAutoCommit(false);//设置为手动提交
                st = co.createStatement();
                st.executeUpdate("insert into pme(empno,ename) values(100,'xxx')");
                
                int x = 9/0;
                
                st.executeUpdate("insert into pme(empno,ename) values(200,'yyy')");
                co.commit(); //手动提交
               co.setAutoCommit(true);  设置为自动提交
            }catch(ClassNotFoundException e){
                e.printStackTrace();
            }catch(SQLException e){
                e.printStackTrace();
    /*若自动提交时抛出异常,则回滚,然后再设置成自动提交*/
               try{
                   co.rollback();
                    co.setAutoCommit(true);
               }catch(SQLException e1){
                   e1.printStackTrace();
              }
    /*如上为自动提交时的异常处理*/
            }finally{
                try{
                    if(st != null){
                        st.close();
                        st = null;
                    }
                    if(co != null){
                        co.close();
                        co = null;
                    }
                }catch(SQLException e){
                    e.printStackTrace();
                }                
            }
        }}
      

  2.   

    1、新的Connection默认自动提交,意即执行一个SQL即为一个事务。
    2、如果设置 co.setAutoCommit(false),则之后的所有SQL语句为一个事务,直到rollback或commit;所谓事务是用于保证数据的一致性,它由一组相关的DML语句组成,该组的DML语句要么全部成功,要么全部失败。例如银行转帐操作,转出帐户的减少的update操作与转入帐户增加的update操作应该为一个事务。
      

  3.   

    co.setAutoCommit(false);//设置不自动提交执行完语句co.commit(); 出现异常co.rollback();