Dashboard > OpenSource Project > ... > Spring > 入門 32 - 簡介Spring事務管理
OpenSource Project Log In   View a printable version of the current page.
入門 32 - 簡介Spring事務管理
Added by cheetah, last edited by magic on Dec 04, 2005  (view change)
Labels: 
(None)

  關於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:

 代碼:

PlatformTransactionManager.java
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()來設定反轉事務,或是想探知目前事務的一些資訊,其介面定義如下:

 代碼

TransactionStatus.java
public interface TransactionStatus {

    boolean isNewTransaction();

    boolean hasSavepoint();

    void setRollbackOnly();

    boolean isRollbackOnly();

    boolean isCompleted();
}

  通常我們會藉由Spring的TransactionTemplate來簡化編程式的事務處理,或者是透過Spring AOP結合TransactionAttribute來進行宣告式的事務處理,下圖簡單的列出Spring中事務管理的一些相關類別:

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.1.5a Build:#411 Mar 16, 2006) - Bug/feature request - Contact Administrators