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

Java 事務核心原理:從 ACID 到 JDBC/JTA/容器事務全景解析

     編輯:Java 程式設計入門

事務是數據一致性的守護者。本文從 ACID 原則出發,梳理 Java 事務的三大類型——JDBC、JTA、容器事務,幫你建立完整知識體系。

一、什麼是事務?

事務是一組不可分割的操作單元,滿足 ACID 四大特性:

  • 原子性:全做或全不做
  • 一致性:事務前後數據完整性約束保持不變
  • 隔離性:併發事務互不干擾
  • 持久性:提交後的修改永久生效

通俗理解:銀行轉賬,扣款與入賬必須同時成功或同時失敗。

二、為什麼需要事務?

解決數據安全訪問問題。無事務時,網絡中斷導致扣款成功但入賬失敗,數據即不一致。事務將相關操作綁定為整體,保證業務邏輯正確性。

三、Java 事務三大類型

1. JDBC 事務(基礎)

基於 Connection 對象控制:

Connection conn = dataSource.getConnection();
conn.setAutoCommit(false); // 關閉自動提交
try {
    // 多條 SQL 操作
    stmt1.executeUpdate(sql1);
    stmt2.executeUpdate(sql2);
    conn.commit(); // 統一提交
} catch (Exception e) {
    conn.rollback(); // 回滾
} finally {
    conn.setAutoCommit(true);
    conn.close();
}

局限:無法跨多個數據庫/資源管理器。

2. JTA 事務(分布式)

Java Transaction API,支持跨多個資源(數據庫、消息隊列等)的全局事務。核心接口:

  • UserTransaction:應用程序邊界控制(begin/commit/rollback)
  • TransactionManager:容器/框架級事務管理
  • XAResource:資源管理器適配 XA 協議(兩階段提交)

典型流程:TM 協調多個 RM(資源管理器)執行 準備 → 提交/回滾 兩階段。

3. 容器事務 / Spring 事務(聲明式)

EJB 容器或 Spring 框架通過 AOP 代理,將事務邊界與業務代碼分離:

@Transactional(rollbackFor = Exception.class)
public void transfer(Account from, Account to, BigDecimal amount) {
    from.debit(amount);
    to.credit(amount);
    // 拋出異常自動回滾
}

核心屬性:傳播行為、隔離級別、超時、只讀、回滾規則。

四、事務隔離級別與併發異常

隔離級別臟讀不可重複讀幻讀性能
READ_UNCOMMITTED√√√最高
READ_COMMITTED×√√高
REPEATABLE_READ××√中
SERIALIZABLE×××最低

MySQL InnoDB 默認 REPEATABLE_READ,Oracle/PostgreSQL 默認 READ_COMMITTED。

五、Spring 事務傳播行為詳解

  • REQUIRED(默認):有事務加入,無則新建
  • REQUIRES_NEW:掛起當前事務,強制新建獨立事務
  • NESTED:嵌套事務,外層回滾內層必回滾,內層回滾外層可選擇提交
  • SUPPORTS / NOT_SUPPORTED / MANDATORY / NEVER

理解事務本質,選對事務類型,配好隔離級別與傳播行為,是寫出高可靠業務代碼的關鍵。實戰中優先使用 Spring 聲明式事務,分布式場景引入 Seata/Atomikos 等 JTA 實現。

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