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