JDBC處理Transaction

 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

相關文章
相關標籤/搜索