JAVA中處理事務的程式--多條更新SQL語句的執行(包括回滾) .

weixin_34321977發表於2012-11-18

轉自:http://blog.csdn.net/fafeiboy/article/details/2734889

 在與資料庫操作時,如果執行多條更新的SQL語句(如:update或insert語句),在執行第一條後如果出現異常或電腦斷電,

則後面的SQL語句執行不了,這時候設定我們自己提交SQL語句,不讓JDBC自動提交,格式為:

conn.setAutoCommit(false);

執行多條SQL語句;

conn.commit();

//恢復自動提交模式

conn.setAutoCommit(true);

程式碼示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestTransaction {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Connection con = null;
  Statement stmt = null;
  ResultSet rs = null;
  PreparedStatement ps = null;
  try {
   Class.forName("com.mysql.jdbc.Driver");
   con = DriverManager.getConnection(
     "jdbc:mysql://localhost:3306/mydb", "root", "root");
   System.out.println("連線資料庫成功!");
   stmt = con.createStatement();
   // JAVA預設為TRUE,我們自己處理需要設定為FALSE,並且修改為手動提交,才可以呼叫rollback()函式
   con.setAutoCommit(false);
   stmt.addBatch("insert into people values(078,'ding','duo')");
   stmt.addBatch("insert into people values(30,'nokia','ddd')");
   stmt.executeBatch();
   // 事務提交
   con.commit();
   // 設定為自動提交,改為TRUE
   con.setAutoCommit(true);

   /*
    * String sql = "select * from people"; rs = stmt.executeQuery(sql);
    * while(rs.next()){ System.out.println(rs.getString("id") + " " +
    * rs.getString("name")); }
    */
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch (SQLException se) {
   se.printStackTrace();
   try {
    // 產生的任何SQL異常都需要進行回滾,並設定為系統預設的提交方式,即為TRUE
    if (con != null) {
     con.rollback();
     con.setAutoCommit(true);
    }
   } catch (SQLException se1) {
    se.printStackTrace();
   }
  } finally {
   try {
    if (rs != null) {
     rs.close();
     rs = null;
    }
    if (stmt != null) {
     stmt.close();
     stmt = null;
    }
    if (con != null) {
     con.close();
     con = null;
    }
   } catch (SQLException se) {
    se.printStackTrace();
   }
  }
 }

}

相關文章