JDBC 事務處理

1、事務的概念sql

事務處理在數據庫開發中有着很是重要的做用,所謂事務就是全部的操做要麼一塊兒成功,要麼一塊兒失敗,事務自己具備原子性(Atomicity)、一致性(Consistency)、隔離性或獨立性(Isolation) 、持久性(Durability)4 個特 性,這 4 個特性也被稱爲 ACID 特徵。數據庫

原子性:原子性是事務最小的單元,是不可再分隔的單元,至關於一個個小的數據庫操做,這些操做必須同時 成功,若是一個失敗了,則一切的操做將所有失敗。spa

一致性:指的是在數據庫操做的先後是徹底一致的,保證數據的有效性,若是事務正常操做則系統會維持有效 性,若是事務出現了錯誤,則回到最原始狀態,也要維持其有效性,這樣保證事務開始時和結束時系統處於一 致狀態。code

隔離性:多個事務能夠同時進行且彼此之間沒法訪問,只有當事務完成最終操做時,才能夠看到結果。blog

持久性:事務完成以後,它對於系統的影響是永久性的。該修改即便出現致命的系統故障也將一直保持。事務

一、就算李四沒有接收到錢,張三的錢也有可能轉出ci

 1 /**
 2      * 轉出
 3      * @param con
 4      * @param accountName
 5      * @param account
 6      * @throws Exception
 7      */
 8     private static void outCount(Connection con,
 9             String accountName,int account)throws Exception{
10         String sql="update t_account set accountBalance=accountBalance-? "
11                 + "where accountName=?";
12         PreparedStatement pstmt=con.prepareStatement(sql);
13         pstmt.setInt(1, account);
14         pstmt.setString(2, accountName);
15         pstmt.executeUpdate();
16     }
17     /**
18      * 轉入
19      * @param con
20      * @param accountName
21      * @param account
22      * @throws Exception
23      */
24     private static void inCount(Connection con,
25             String accountName,int account)throws Exception{
26         String sql="update t_account set accountBalance=accountBalance+? "
27                 + "where accountName=?";
28         PreparedStatement pstmt=con.prepareStatement(sql);
29         pstmt.setInt(1, account);
30         pstmt.setString(2, accountName);
31         pstmt.executeUpdate();
32     }
33     
34     public static void main(String[] args) {
35         Connection con=null;
36         try {
37             con=dbUtil.getCon();
38             con.setAutoCommit(false);//取消自動提交
39             System.out.println("張三向李四轉帳!");
40             int account=500;
41             outCount(con, "張三", account);
42             inCount(con, "李四", account);
43             System.out.println("轉帳成功!");
44         } catch (Exception e) {
45             try {
46                 con.rollback();
47             } catch (SQLException e1) {
48                 e1.printStackTrace();
49             }
50             e.printStackTrace();
51         }finally {
52             try {
53                 con.commit();
54                 con.close();
55             } catch (SQLException e) {
56                 e.printStackTrace();
57             }
58         }
59     }

一、轉入與轉出的錢必須一一對應纔可執行開發

 1 /**
 2      * 轉出
 3      * @param con
 4      * @param accountName
 5      * @param account
 6      * @throws Exception
 7      */
 8     private static void outCount(Connection con,
 9             String accountName,int account)throws Exception{
10         String sql="update t_account set accountBalance=accountBalance-? "
11                 + "where accountName=?";
12         PreparedStatement pstmt=con.prepareStatement(sql);
13         pstmt.setInt(1, account);
14         pstmt.setString(2, accountName);
15         pstmt.executeUpdate();
16     }
17     /**
18      * 轉入
19      * @param con
20      * @param accountName
21      * @param account
22      * @throws Exception
23      */
24     private static void inCount(Connection con,
25             String accountName,int account)throws Exception{
26         String sql="update t_account set accountBalance=accountBalance+? "
27                 + "where accountName=?";
28         PreparedStatement pstmt=con.prepareStatement(sql);
29         pstmt.setInt(1, account);
30         pstmt.setString(2, accountName);
31         pstmt.executeUpdate();
32     }
33     
34     public static void main(String[] args) {
35         Connection con=null;
36         Savepoint sp=null;
37         try {
38             con=dbUtil.getCon();
39             con.setAutoCommit(false);//取消自動提交
40             System.out.println("張三向李四轉帳!");
41             int account=500;
42             outCount(con, "張三", account);
43             sp=con.setSavepoint();//設置一個保存點 44             inCount(con, "李四", account);
45             System.out.println("轉帳成功!");
46         } catch (Exception e) {
47             try {
48                 con.rollback(sp);//回滾到sp保存點
49             } catch (SQLException e1) {
50                 e1.printStackTrace();
51             }
52             e.printStackTrace();
53         }finally {
54             try {
55                 con.commit();
56                 con.close();
57             } catch (SQLException e) {
58                 e.printStackTrace();
59             }
60         }
61     }
相關文章
相關標籤/搜索