自动事务_JDBC进阶(二)事务编程
生活随笔
收集整理的這篇文章主要介紹了
自动事务_JDBC进阶(二)事务编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、事務簡介
事務是用戶定義的一個數據庫操作序列,這些操作要么全做,要么全不做,是一個不可分割的工作單位。
事務具有ACID特性:
- 原子性(Atomicity) —— 原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
- 一致性(Consistency) —— 事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
- 隔離性(Isolation) —— 一個事務的執行不能被其他事務干擾,多個并發事務之間要相互隔離。
- 持久性(Durability) —— 一個事務一旦提交,它對數據庫中數據的改變就應該是永久的。接下來的其他操作或故障不應該對其執行結果有任何影響。
關于事務的基本理論在許多書籍資料中都能找到,這里就不贅訴了。
二、JDBC中事務的提交與回滾
如果在JDBC中不明確指定開啟事務,那么所有的代碼操作都在一個默認的事務中進行,默認的事務會自動開啟,自動提交。因此如果我們需要在JDBC中手動操作事務,就首先需要關閉事務的自動提交。
JDBC中關于事務操作的API:
- void setAutoCommit(boolean autoCommit) —— 設置事務是否自動提交,如果設置為false,表示手動提交事務。
- void commit() —— 手動提交事務
- void rollback() —— 手動回滾事務(出現異常時候,所有已經執行成功的代碼需要回退到事務開始前的狀態)。
- Savepoint setSavepoint() —— 設置事務回滾到哪個位置。
可以使用一個轉賬的示例來演示事務的提交與回滾:
假設基于上面這個表完成一次轉賬操作:張三轉賬100元給李四。
// 參數: // jdbc協議:postgresql子協議://主機地址:數據庫端口號/要連接的數據庫名 String url = "jdbc:postgresql://localhost:5432/test2"; // 數據庫用戶名 String user = "postgres"; // 數據庫密碼 String password = "123456";// 1. 加載Driver類,Driver類對象將自動被注冊到DriverManager類中 Class.forName("org.postgresql.Driver");// 2. 連接數據庫,返回連接對象 Connection conn = DriverManager.getConnection(url, user, password);PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null; try {// 3. 關閉事務的自動提交機制conn.setAutoCommit(false);// 4. 預編譯SQL// 從張三賬戶中減去100元String sql1 = "UPDATE bank SET money = money - 100 WHERE name = ?"; pstmt1 = conn.prepareStatement(sql1);pstmt1.setString(1, "張三");// 往李四賬戶中增加100元String sql2 = "UPDATE bank SET money = money + 100 WHERE name = ?";pstmt2 = conn.prepareStatement(sql2);pstmt2.setString(1, "李四");// 5. 執行SQL語句pstmt1.executeUpdate();pstmt2.executeUpdate(); } catch (Exception e) {// 6. 如果發生異常,則回滾事務conn.rollback(); } finally {// 6. 如果沒有發生異常,則提交事務conn.commit();// 7. 關閉資源pstmt1.close();pstmt2.close();conn.close(); }這樣把轉賬操作放置在一個事務中執行,保證了事務的隔離性。即使轉賬操作發生異常,事務也能正確回滾,保證數據庫中總金額仍然是2000。
三、JDBC中事務回滾到特定位置
調用setSavepoint()就能指定事務發生異常時回滾到特定位置:
// 省略參數代碼// 1. 加載Driver類,Driver類對象將自動被注冊到DriverManager類中 Class.forName("org.postgresql.Driver");// 2. 連接數據庫,返回連接對象 Connection conn = DriverManager.getConnection(url, user, password);PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null; Savepoint sp = null; try {// 3. 關閉事務的自動提交機制,并指定事務回滾到這個位置conn.setAutoCommit(false);sp = conn.setSavepoint();// 4. 預編譯SQL// 從張三賬戶中減去100元String sql1 = "UPDATE bank SET money = money - 100 WHERE name = ?"; pstmt1 = conn.prepareStatement(sql1);pstmt1.setString(1, "張三");// 往李四賬戶中增加100元String sql2 = "UPDATE bank SET money = money + 100 WHERE name = ?";pstmt2 = conn.prepareStatement(sql2);pstmt2.setString(1, "李四");// 5. 執行SQL語句pstmt1.executeUpdate();pstmt2.executeUpdate(); } catch (Exception e) {// 6. 如果發生異常,則回滾事務到指定位置conn.rollback(sp); } finally {// 6. 如果沒有發生異常,則提交事務conn.commit();// 7. 關閉資源pstmt1.close();pstmt2.close();conn.close(); }總結
以上是生活随笔為你收集整理的自动事务_JDBC进阶(二)事务编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 躺平也要看,2022年计算机相关考试汇总
- 下一篇: realme GT2大师探索版屏幕确认: