Spring事務管理

shwenwen發表於2009-08-07

學習spring事務管理時,我忍不住要問,spring為什麼進行事務管理,spring怎麼進行的事務管理?主要透過兩個方式:程式設計方式和宣告方式。

程式設計方式有兩種:使用TransactionTemplate和直接使用PlatformTransactionManager

宣告方式有:通常透過TransactionProxyFactoryBean設定Spring事務代理和BeanNameAutoProxyCreator

[@more@]

Spring事務管理
  在學習spring事務管理時,我忍不住要問,spring為什麼進行事務管理,spring怎麼進行的事務管理?

  首先,為什麼要進行事務,接下來說說spring是怎樣進行事務管理的.

  ① Spring事務策略

  Spring事務策略,也就是spring事務管理的實現方式.它有一個統一的抽象是由實現下面這個介面完成的.

  org.springframework.transaction.PlatformTransactionManager

  此介面的內容如下:

  Public interfacePlatformTransactionManager()...{

  TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;

  Void commit(TransactionStatus status) throws TransactionException;

  Void rollback(TransactionStatus status) throws TransactionException;

  }

  不管是宣告式的還是程式設計式的事務管理都需要此抽象來完成.

  解釋一下這個介面,這樣可以更好的理解spring的事務控制的原理.

  getTransaction()根據型別為TransactionDefinition的引數返回一個TransactionStatus物件.返回的TransactionStatus物件可能代表一個新的或已經存在的事務(如果在當前呼叫堆疊有一個符合條件的事務).如同J2EE事務上下文,一個TransactionStatus也是和執行的執行緒關聯的.

  同時,在框架中還存在TransactionDefinition介面,即上邊的引數型別.此介面指定了事務隔離程度、事務傳播、事務超時、只讀狀態。

  另外,還有TransactionStatus介面。這個介面為處理事務提供簡單的控制事務執行和查詢事務狀態的方法。

  ② 兩種事務管理方式:程式設計式、宣告式。

  Spring提供兩種方式的程式設計式事務管理,分別是:使用TransactionTemplate和直接使用PlatformTransactionManager。

  ⅰ. TransactionTempale採用和其他Spring模板,如JdbcTempalte和HibernateTemplate一樣的方法。它使用回撥方法,把應用程式從處理取得和釋放資源中解脫出來。如同其他模板,TransactionTemplate是執行緒安全的。

  程式碼片段:

  Object result =tt.execute(newTransactionCallback()...{

  publicObject doTransaction(TransactionStatus status)...{

  updateOperation();

  returnresultOfUpdateOperation();

  }

  });

  使用TransactionCallback()可以返回一個值。

  如果使用TransactionCallbackWithoutResult則沒有返回值。

  ⅱ. 也可以使用PlatformTransactionManager直接管理事務。簡單地透過一個bean引用給你的bean傳遞一個你使用的PlatformTransaction物件。然後,使用TransactionDefinition和TransactionStatus物件就可以發起、回滾、提交事務。

  如下片段:

  DefaultTransactionDefinition def=newDefaultTransactionDefinition(); //new 一個事務

  def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); //初始化事務,引數定義事務的傳播型別;

  TransactionStatus status =transactionManager.getTransaction(def); //獲得事務狀態

  try...{

  ……………..

  transactionManager.commit(status); //提交事務;

  }catch(…..)...{

  transactionManager.rollback(status); //回滾事務;

  }

  Spring也提供宣告式事務管理。這是透過AOP實現的。

  大多數Spring使用者選擇宣告式事務管理,這是最少影響應用程式碼的選擇,因而這是和非侵入性的輕量級容器的觀念是一致的。

  ① 通常透過TransactionProxyFactoryBean設定Spring事務代理。需要一個目標物件包裝在事務代理中。這個目標物件一般是一個普通Javabean。當我們定義TransactionProxyFactoryBean時,必須提供一個相關的PlatformTransactionManager的引用和事務屬性。事務屬性含有事務定義。例如:

  PROPAGATION_REQUIRED,-MyCheckedException

  PROPAGATION_REQUIRED

  PROPAGATION_REQUIRED,readOnly

  事務代理會實現目標物件的介面:這裡是屬性名是target的引用。id是transactionServiceControl。(●使用CGLIB也可以實現具體類的代理。只要設定proxyTargetClass屬性為true即可。如果目標物件沒有實現任何介面,這將自動設定該屬性為true。通常,我們希望面向介面程式設計。) ●使用proxyInterfaces屬性來限定事務代理來代理指定介面也是可以。 ●也可以透過從org.springframework.aop.framework.ProxyConfig繼承或所有AOP代理工廠共享的屬性來定製TransactionProxyFactoryBean行為。

  然後,說說屬性名是transactionAttributes意義:

  這裡的transactionAttributes屬性是定義在org.springframework.transaction.interceptor.NameMathTransactionAttributeSource中的屬性格式設定。這個包括萬用字元的方法名稱對映是很直觀的,如”insert*”。注意insert*的對映的值包括回滾規則。”-MyCheckException”指定如果方法丟擲MyCheckException或它的子類,事務會自動回滾。可以用逗號分隔多個回滾規則。“-”字首強制回滾,“+”字首指定提交(這允許即使丟擲unchecked異常時也可以提交事務)。“PROPAGATION_REQUIRED”指定事務傳播範圍。

  TransactionProxyFactoryBean允許你透過“preInterceptors”和“postInterceptors”屬性設定前或後的攔截操作。可以設定任意數量的前和後透過,它們的型別可以是Advistor(切入點),MethodInterceptor或被當前Spring配置支援的通知型別。例如:ThrowAdvice,AfterReturningAdvice或BeforeAdvice。這些通知必須支援例項共享模式。如果你需要高階AOP特性操作事務,透過org.springframework.aop.framework.ProxyFactoryBean,而不是TransactionProxyFactory實用代理建立者。

  ② 另一種宣告方式:BeanNameAutoProxyCreator

  使用TransactionProxyFactoryBean當事務代理包裝物件,你可以完全控制代理。如果需要用一致方式包裝大量bean。使用一個BeanFactoryPostProcessor的一個實現,BeanNameAutoProxyCreator,可以提供另外一種方法。(Spring中,一旦ApplicationContext讀完它的初始化資訊,它將初始化所有實現BeanPostProcessor介面的bean,並且讓它們後處理ApplicationContext中所有其他的bean。所以使用這種機制,正確配置的BeanNameAutoProxyCreator可以用來後處理所有ApplicationContext中所有其他的bean),並且把它們用事務代理包裝起來。真正生成的事務代理和使用TransactionProxyFactoryBean生成的基本一致。

  最後,總結一下Spring的優點:

  Spring是java平臺上的一個開源應用框架。 Spring框架本身並沒有強制實行任何特別的程式設計模式。在Java社群裡,Spring作為EJB模型之外的另外一個選擇甚至是替代品而廣為流行。從設計上看,Spring給予了Java程式設計師許多的自由度,但同時對業界常見的問題也提供了良好的文件和易於使用的方法。 Spring框架的核心功能在任何Java應用中都是適用的。在基於Java企業平臺上的web應用中,大量的擴充和改進得以形成。為此,Spring獲得了廣泛的歡迎,並被許多公司認可為具有戰略意義的重要框架。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/143526/viewspace-1025017/,如需轉載,請註明出處,否則將追究法律責任。

相關文章