前幾天看 Spring 事務相關的資料,發現了《Java 事務設計策略》一書,因此總結一下。java
這篇文章主要講事務背後的一些理論知識,代碼次之,主要是爲了讓讀者知其因此然。sql
在這個模型中,開發人員管理鏈接,而不是事務。其實是數據庫管理本地事務。數據庫
public void updateTradeOrder(TradeOrderData order) throws Exception { DataSource ds = null; Connection conn = ds.getConnection(); conn.setAutoCommit(false); Statement stmt = conn.createStatement(); String sql = "update trade_order ... "; try { stmt.executeUpdate(sql); conn.commit(); } catch (Exception e) { conn.rollback(); throw e; } finally { stmt.close(); conn.close(); } }
在這個模型中,開發者管理事務,而不是鏈接。Spring 框架提供了 TransactionTemplate
類用於編程式事務的管理。編程
public void updateTradeOrder(TradeOrderData order) throws Exception { transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { try { dao.updateTradeOrder(order); } catch (Exception e) { status.setRollbackOnly(); throw e; } } }); }
在這個模型中,框架或者容器管理事務的開始和結束(好比,提交或者回滾)。開發人員只須要告訴框架當程序發生異常何時回滾事務,以及在配置文件中配置事務(好比 Spring 的 ApplicationContext.xml)。設計模式
@Transactional(propagation = Propagation.REQUIRED) public void updateTradeOrder(TradeOrderData order){ dao.updateTradeOrder(order); }
JTA 是開發人員用來管理事務的接口。服務器
JTS 是實現了 JTA 的底層事務服務,並且應用於大多數的商業和開源的服務器(請注意除了 JTS 以外,市場上還有其餘可用的事務服務)。架構
JTA 和 JTS 的關係就像 JDBC 和 相關的數據庫驅動同樣。JTA 就像 JDBC,JTS 就像數據庫驅動。好比有 MySQL 數據庫驅動,Oracle 數據庫驅動,都遵照了 JDBC 規範。併發
顧名思義,在這個事務設計模式中,客戶端委託組件擁有事務。框架
當 domain services 過於細化,而且不存在聚合服務時,就會發生這種狀況。當這種狀況發生的時候,咱們須要將事務管理推送到表示層來維護 ACID 屬性。dom
Domain Service 擁有事務設計模式是最經常使用的事務設計模式,並且應用於大部分基於 java 的程序架構中。在這個模式中,Domain Service 組件擁有事務和相關的事務管理。
在 Spring 中,Domain Service 組件被實現爲POJO,同時也使用聲明式事務管理。
當在程序架構中使用命令模式或者服務端委託設計模式時,這個事務設計模式最適用。在這個模式中,服務端委託組件擁有事務以及負責所有事務的管理。
命令模式
這種模式背後的基本原理是客戶端功能被放置在一個命令中併發送到服務端執行。
服務端委託設計模式
此模式只是將客戶端業務代理邏輯放置在服務端上的基於服務端的委託對象中。
服務端擁有事務設計模式 是 Domain Service 擁有事務設計模式 的特例。
當使用命令模式時,服務端委託組件被實現爲一個單一的命令處理器組件,它定位到相應的命令實現對象並執行命令。
使用服務端委託設計模式時,每一個客戶端請求的功能組將做爲單獨的服務端委託實現。
在開發中,咱們主要使用 聲明式事務模型 和 Domain Service 擁有事務設計模式。
因爲本人知識和能力有限,文中若有沒說清楚的地方,但願你們能在評論區指出,以幫助我將博文寫得更好。