w352517879 发表于 2012-8-14 22:32:32

java事务基础的问题

我都找不到相应的版块提问。。。。。


import java.sql.*;
public class TestTransaction {
/**
* @param args
*/
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
try {
   Class.forName("org.gjt.mm.mysql.Driver");
   conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_1","root","123456");
   
   conn.setAutoCommit(false); //设置是否自动提交——否
   stmt = conn.createStatement();
   stmt.addBatch("insert into dt values(4,'qq','N','12')");
   stmt.addBatch("insert into dt values(5,'qq','N','132')");
//如果这个地方报SQLException ,也就是说下面的conn.commit();没有执行那回滚操作是否是多余的呢
   stmt.addBatch("insert into dt values(6,'QQ','N','14')");
   stmt.executeBatch();
   conn.commit();
   conn.setAutoCommit(true);   
} catch (ClassNotFoundException e) {
   e.printStackTrace();
} catch (SQLException e){
   try {
    conn.rollback();            //这个地方的回滚操作是不是多余的啊
    conn.setAutoCommit(true);
   } catch (SQLException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
   e.printStackTrace();   
} finally {   
   try {
    if(stmt != null)stmt.close();
    if(pstmt != null)pstmt.close();
    if(conn != null)conn.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
}

}
}

夢^ǒ^飛 发表于 2012-8-14 22:32:33

问题1://如果这个地方报SQLException ,也就是说下面的conn.commit();没有执行那回滚操作是否是多余的呢
       如果有SQLException 的话,提交确实是多余的,程序会进入catch (SQLException e){进行回滚,但那个conn.commit(); 你不能不写啊,你还要考虑程序正常执行的情况,
    问题2:   同样,第二个地方的那个回滚不是多余的,那就是问题1中说的,如果程序出现SQL异常,才会进入异常捕获,去执行那个回滚,如果没有SQL异常,就正常提交。

w352517879 发表于 2012-8-15 19:27:20

求大神给我一个解释啊:Q

(^o^)/ 发表于 2012-8-20 17:32:07

页: [1]
查看完整版本: java事务基础的问题