首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JDBC 事務編程模型備忘錄:手動控制、保存點與隔離級別

     編輯:Java 相關知識

標準事務控制範本


Connection conn = null;
Savepoint sp = null;
try {
    conn = DriverManager.getConnection(url, user, pwd);
    conn.setAutoCommit(false);                    // 開啟事務
    conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); // 設定隔離級別

    Statement stmt = conn.createStatement();
    stmt.executeUpdate("INSERT INTO test VALUES(1,'aaa')");
    sp = conn.setSavepoint("insert_end");         // 設定保存點
    stmt.executeUpdate("UPDATE test SET name='bbb' WHERE id=1");

    conn.commit();                                // 提交
} catch (SQLException e) {
    try {
        if (sp != null) conn.rollback(sp);        // 回滾到保存點
        // conn.rollback();                        // 或全量回滾
    } catch (SQLException e1) {
        throw new RuntimeException("回滾失敗", e);
    }
    throw new RuntimeException("事務執行失敗", e);
} finally {
    if (conn != null) {
        try { conn.close(); } catch (SQLException e) { throw new RuntimeException("關閉連接失敗", e); }
    }
}

關鍵點說明

  • setAutoCommit(false) 等同開啟事務邊界。
  • 隔離級別 (READ_UNCOMMITTED 到 SERIALIZABLE) 依資料庫與驅動支援度而定,設定不支援的級別通常不報錯但不生效。
  • Savepoint 允許部分回滾,需資料庫與驅動支援 (JDBC 3.0+)。
  • 異常處理中嵌套 try-catch 確保回滾本身不拋出新異常掩蓋原始錯誤。
  • finally 確保連接歸還池,避免洩漏。

實務建議

現代專案幾乎全面使用 Spring @Transactional 或 JTA 容器管理事務,手動 JDBC 事務僅用於輕量級工具、批次腳本或教學示範。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved