JDBC事務

數據庫事務(Database Transaction) ,是指做爲單個邏輯工做單元執行的一系列操做,要麼徹底地執行,要麼徹底地不執行。
事務特性 ACID
1)原子性(atomicity):事務必須是原子工做單元;對其數據修改,要麼全都執行,要麼全都不執行【最小的工做單位】
2)一致性(consistency):事務在完成時,必須使全部的數據都保持一致狀態【同時成功或者同時失敗】
3)隔離性(isolation):由併發事務所做的修改必須與任何其餘併發事務所做的修改隔離【事務與事務之間相互不影響】
4)持久性(durability):事務完成以後,它對於系統的影響是永久性的【事務一旦提交不可回滾】
java

核心代碼:將JDBC自動提交關閉,改爲手動提交,而後在讓出錯的事務在異常裏捕獲成回滾。這樣保證了提交事務出錯數據不改動。從而達到數據的正確性。sql

// JDBC自動提交關閉,改爲手動提交
connection.setAutoCommit(false);
// 手動提交
connection.commit();
// 若是事務出錯,就讓他它回滾
connection.rollback();

詳細代碼測試:數據庫

 1 package boom;
 2 
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.PreparedStatement;
 6 import java.sql.ResultSet;
 7 import java.sql.SQLException;
 8 
 9 /**
10  * 數據庫事務(Database Transaction) ,是指做爲單個邏輯工做單元執行的一系列操做,要麼徹底地執行,要麼徹底地不執行。
11  * 原子性:最小的工做單位
12  * 一致性:同時成功或者同時失敗
13  * 隔離性:事務與事務之間相互不影響
14  * 持久性:事務一旦提交不可回滾
15  * @author Administrator
16  *
17  */
18 public class JDBC_test06 {
19     public static void main(String[] args) {
20         // 聲明參數
21         String driver = "oracle.jdbc.driver.OracleDriver";
22         String url = "jdbc:oracle:thin:@localhost:1521:XE";
23         String username = "scott";
24         String userpwd = "tiger"; 
25         
26         // 聲明鏈接
27         Connection connection = null;
28         PreparedStatement ps  = null;
29         ResultSet resultSet = null;
30         
31         try {
32             //1.加載驅動
33             Class.forName(driver);
34             //2.建立鏈接
35             connection = DriverManager.getConnection(url, username, userpwd);
36             
37             // JDBC自動提交關閉,改爲手動提交
38             connection.setAutoCommit(false);
39             //3.發送SQL語句
40             String update01 = "update comm set sal=sal+1000 where id=1";
41             String update02 = "update comm set saddl=sal-1000 where id=2";
42             //4.獲取資源
43             ps = connection.prepareStatement(update01);
44             int n1 = ps.executeUpdate();
45             //5.處理結果
46             if(n1>0){
47                 System.out.println("JDBC_test06.main(測試成功01)");
48             }
49             ps = connection.prepareStatement(update02);
50             int n2 = ps.executeUpdate();
51             if(n2>0){
52                 System.out.println("JDBC_test06.main(測試成功02)");
53             }
54             // 手動提交
55             connection.commit();
56             
57         } catch (ClassNotFoundException | SQLException e) {
58             try {
59                 // 若是事務出錯,就讓他它回滾
60                 connection.rollback();
61             } catch (SQLException e1) {
62                 // TODO Auto-generated catch block
63                 e1.printStackTrace();
64             }
65             e.printStackTrace();
66         }finally {
67             try {
68                 if(ps!=null)
69                 ps.close();
70             } catch (SQLException e) {
71                 e.printStackTrace();
72             }
73             try {
74                 if(connection!=null)
75                     connection.close();
76             } catch (SQLException e) {
77                 e.printStackTrace();
78             }
79         }
80     }
81 } 
View Code

故意寫錯第二條SQL語句,可是第一條SQL語句仍是能夠正常執行。但由於在異常裏捕捉了回滾事務。因此數據並沒有變化
併發

相關文章
相關標籤/搜索