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

Java 事務處理實戰:JDBC 本地事務 vs JTA 分散式事務完整比較

     編輯:Java 相關知識

事務核心概念 (ACID)

特性英文含義
原子性Atomicity全做或全不做
一致性Consistency事務前後資料滿足完整性約束
隔離性Isolation並發事務互不干擾
持久性Durability提交後永久生效

範例場景:三表聯動刪除

  • 主表:bylaw (規章制度),PK: ID
  • 子表:bylaw_content (文本)、bylaw_affix (附件),FK: bylawid 關聯主表
  • 業務需求:刪除主表記錄時,三表必須同步刪除,否則資料不一致

示例表結構

方案一:JavaBean + JDBC 本地事務

適用單一資料庫、非分散式環境。

public int delete(int sID) {
    DataBaseConnection dbc = new DataBaseConnection();
    Connection con = dbc.getConnection();
    try {
        con.setAutoCommit(false); // 關閉自動提交 → 開啟事務

        dbc.executeUpdate("delete from bylaw where ID=" + sID);
        dbc.executeUpdate("delete from bylaw_content where ID=" + sID);
        dbc.executeUpdate("delete from bylaw_affix where bylawid=" + sID);

        con.commit(); // 提交事務
        con.setAutoCommit(true); // 恢復預設
        dbc.close();
        return 1;
    } catch (Exception exc) {
        con.rollback(); // 回滾事務
        exc.printStackTrace();
        dbc.close();
        return -1;
    }
}

關鍵點

  • Connection.setAutoCommit(false) 手動控制事務邊界
  • 同一 Connection 內的所有操作屬於同一事務
  • 異常時必須 rollback(),並確保 close() 在 finally 或 catch 中執行
  • 不支援跨多個資料庫/資源管理器

方案二:Session Bean + JTA (Java Transaction API)

適用分散式環境、多資料庫、容器管理交易 (CMT) 或 Bean 管理交易 (BMT)。

public int delete(int sID) {
    DataBaseConnection dbc = new DataBaseConnection();
    dbc.getConnection(); // 取得連線 (通常由容器 DataSource 提供)

    UserTransaction transaction = sessionContext.getUserTransaction(); // 取得 JTA 事務管理器
    try {
        transaction.begin(); // 開始 JTA 事務

        dbc.executeUpdate("delete from bylaw where ID=" + sID);
        dbc.executeUpdate("delete from bylaw_content where ID=" + sID);
        dbc.executeUpdate("delete from bylaw_affix where bylawid=" + sID);

        transaction.commit(); // 提交 JTA 事務
        dbc.close();
        return 1;
    } catch (Exception exc) {
        try {
            transaction.rollback(); // JTA 回滾
        } catch (Exception ex) {
            ex.printStackTrace(); // 回滾失敗處理
        }
        exc.printStackTrace();
        dbc.close();
        return -1;
    }
}

JTA 核心介面

JTA 優勢

  • 支援跨多個資源管理器 (多資料庫、JMS、JCA) 的單一事務
  • 容器可管理交易生命週期 (CMT:@TransactionAttribute),減少樣板代碼
  • 標準化分散式交易協議 (XA/兩階段提交)

兩種方案對比選型指南

介面角色關鍵方法
UserTransaction應用程式/Bean 管理交易邊界begin(), commit(), rollback(), setRollbackOnly()
TransactionManager容器/系統管理交易上下文suspend(), resume(), enlistResource()
Transaction交易本身資訊getStatus(), registerSynchronization()
維度JDBC 本地事務JTA 分散式事務
資料源數量單一多個 (XA 驅動必要)
部署環境SE / 簡單 Web 容器 (Tomcat/Jetty)全功能 Java EE 容器 (WebLogic/WildFly/WebSphere)
程式複雜度低 (手動控制)中 (需理解容器交易屬性)
效能開銷極低較高 (XA 協議、兩階段提交)
適用場景單庫 CRUD、報表、批次跨庫轉帳、訂單-庫存-付款、微服務協調

最佳實踐與避坑指南

  1. 事務邊界最小化:僅包含必要資料庫操作,避免網路呼叫、複雜計算在事務內
  2. 避免混用:同一方法勿同時使用 JDBC、JTA、CMT
  3. 異常處理:rollback() 亦可能拋出例外,需嵌套 try-catch
  4. 連線管理:JTA 環境下由容器管理連線池,勿手動 close() 干擾容器交易狀態
  5. 隔離級別:預設 READ_COMMITTED,高一致性需求可升級 REPEATABLE_READ/SERIALIZABLE (注意鎖爭用)
  6. 超時設定:配置交易超時防止長事務佔用資源

現代框架整合

  • Spring:@Transactional 統一抽象 JDBC/JTA/Hibernate 事務,支援聲明式/程式化
  • Java EE / Jakarta EE:CMT 為預設,@TransactionAttribute 控制傳播行為
  • 微服務:Saga 模式、TCC、Seata 等最終一致性方案替代傳統分散式事務
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved