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 }