| 特性 | 英文 | 含義 |
|---|---|---|
| 原子性 | Atomicity | 全做或全不做 |
| 一致性 | Consistency | 事務前後資料滿足完整性約束 |
| 隔離性 | Isolation | 並發事務互不干擾 |
| 持久性 | Durability | 提交後永久生效 |
bylaw (規章制度),PK: IDbylaw_content (文本)、bylaw_affix (附件),FK: bylawid 關聯主表
適用單一資料庫、非分散式環境。
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 中執行適用分散式環境、多資料庫、容器管理交易 (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;
}
}
| 介面 | 角色 | 關鍵方法 |
|---|---|---|
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、報表、批次 | 跨庫轉帳、訂單-庫存-付款、微服務協調 |
rollback() 亦可能拋出例外,需嵌套 try-catchclose() 干擾容器交易狀態@Transactional 統一抽象 JDBC/JTA/Hibernate 事務,支援聲明式/程式化@TransactionAttribute 控制傳播行為