1 package com.ayang.jdbc; 2 3 import java.sql.*; 4 /** 5 * transaction的構成,隨便寫一句insenrt,一執行executeUpdate(),它自動提交。 6 * 下邊例子有三條update語句,假設第一條是updateA帳戶上的錢完了,自動提交,這時候出錯了,B帳戶上的錢沒update,這時候會出現數據不一致的問題。 7 * 解決辦法很簡單,把它放在一個transtraction裏去,要麼兩條同時完成,要麼都不完成。 8 * 任何一條DML語句會自動提交,由於在整個數據庫鏈接裏,有一個屬性:AutoCommit();默認爲值true,會自動提交。要想把某些語句放在一個transaction裏, 9 * 把AutoCommit(false);設爲false,手動提交:最後執行conn.commit();而後恢復AutoCommit()爲true. 10 * 若是catch到任何SQLException,首先進行conn.rollback();而後conn.setAutoCommit(true);確保萬無一失。 11 */ 12 13 14 public class TestTransaction { 15 16 public static void main(String[] args) { 17 Connection conn = null; 18 Statement stmt = null; 19 try { 20 Class.forName("oracle.jdbc.driver.OracleDriver"); 21 conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","root"); 22 23 conn.setAutoCommit(false); 24 stmt = conn.createStatement(); 25 stmt.addBatch("insert into dept2 values(60,'CPU','XUCHANG')"); 26 stmt.addBatch("insert into dept2 values(61,'CPU','XUCHANG')"); 27 stmt.addBatch("insert into dept2 values(62,'CPU','XUCHANG')"); 28 stmt.executeBatch(); 29 conn.commit(); 30 conn.setAutoCommit(true); 31 32 33 } catch (ClassNotFoundException e) { 34 e.printStackTrace(); 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 38 try { 39 if(conn != null){ 40 conn.rollback(); //有異常時回滾。 41 conn.setAutoCommit(true); 42 43 } 44 }catch (SQLException e1) { 45 e1.printStackTrace(); 46 }finally{ 47 try{ 48 if(conn!=null){ 49 conn.close(); 50 }if(stmt!=null){ 51 stmt.close(); 52 } 53 }catch (SQLException e1) { 54 e1.printStackTrace(); 55 } 56 } 57 } 58 59 60 61 } 62 63 }
自動提交效果對比,能插入前兩條記錄(第三條sql語句缺失into)第三條sql不會執行。java
//conn.setAutoCommit(false);sql
stmt = conn.createStatement();數據庫
stmt.addBatch("insert into dept2 values(60,'CPU','XUCHANG')");oracle
stmt.addBatch("insert into dept2 values(61,'CPU','XUCHANG')");spa
stmt.addBatch("insert dept2 values(62,'CPU','XUCHANG')");code
stmt.executeBatch();blog
conn.commit();get
//conn.setAutoCommit(true);it