關於Spring事務管理,在參考手冊的第七章有著詳細的說明,這邊則是將參考手冊中的內容作個更簡單的整理,若有更詳細的閱讀需求,可以查閱參考手冊。
傳統上,J2EE的事務管理分作global的事務管理與local的事務管理。global的事務管理由應用伺服器管理,依賴於JTA,並有能力處理多個事務資源,就參考手冊所言的,JTA不易使用,通常藉由EJB CMT:一種宣告式事務管理(declarative transaction management)形式。
local的事務管理中,應用伺服器不介入事務管理,local的事務管理通常依賴於特定資源,像是JDBC、Hibernate的rollback()、commit()方法。local的事務管理對於組件本身有較強的侵入性,您必須親自管理事務,例如劃分事務邊界,具體來說,您必須明確的在程式中撰寫rollback()、commit()等方法處理事務,由於直接依賴於特定資源,在組件移植時,事務管理部份就有可能不相容,例如轉換至應用伺服器的事務管理時。
Spring提供編程式的事務管理(programmatic transaction management)與宣告式的事務管理(declarative transaction management),對於local的事務管理,我們可以使用編程方式來處理事務,傳統的事務處理,例如JDBC,可以照樣撰寫,而不必作太大的變更,而且Spring提供了一些輔助類與Template類,可以簡化傳統的資料庫操作與事務處理,並可以運用其例外階層的優點。
Spring在事務管理上可以提供一致性的模型,您可以使用宣告式的事務處理,如此您的組件就不用介入事務處理,藉由AOP介面入組件進行事務管理,事務管理只需要在定義檔中作一些選項撰寫,由於組件並不介入實質的事務處理,它可以設計的更通用,而改變事務處理策略,意味著您只要改變定義檔的設定,而不用對組件作任何的變動。
Spring封裝了事務策略,它的中心介面是 org.springframework.transaction.PlatformTransactionManager:
代碼:
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
PlatformTransactionManager的實例通常在Bean定義檔中聲明,像是JtaTransactionManager。在不使用global事務的時候,為了讓PlatformTransactionManager追蹤控制connection的使用,有一個特別需要注意的寫作方式要遵守:請勿呼叫DataSource的getConnection()方法取得connection,而是改用org.springframework.jdbc.datasource.DataSourceUtils如下:
Connection conn = DataSourceUtils.getConnection(dataSource);
這樣做的另外一個額外好處是所有的SQLException都會被包在Spring的CannotGetJdbcConnectionException之內,讓您能更方便的處理程式遇到的例外。
TransactionDefinition代表著事務處理時一些屬性定義,像是傳播行為(propagation behavior)、隔離層次(isolation level)、逾時(timeout)、唯讀(read-only)等,如果您不太瞭解事務定義,又想使用基本的事務管理功能,您可以使用DefaultTransactionDefinition。
TransactionStatus代表了目前的事務,在多數的情況下我們不會用到它,除了想要藉由它的setRollbackOnly()來設定反轉事務,或是想探知目前事務的一些資訊,其介面定義如下:
代碼
public interface TransactionStatus {
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
boolean isCompleted();
}
通常我們會藉由Spring的TransactionTemplate來簡化編程式的事務處理,或者是透過Spring AOP結合TransactionAttribute來進行宣告式的事務處理,下圖簡單的列出Spring中事務管理的一些相關類別: