Spring 中的TransactionTemplate

使用TransactionTemplate 不需要顯式地開始事務,甚至不需要顯式地提交事務。這些步驟都由模板完成。但出現異常時,應通過TransactionStatus 的setRollbackOnly 顯式回滾事務。 
TransactionTemplate 的execute 方法接收一個TransactionCallback 實例。Callback 也是Spring 的經典設計,用於簡化用戶操作, TransactionCallback 包含如下方法。 
• Object dolnTransaction(TransactionStatus status) 。 
該方法的方法體就是事務的執行體。 
如果事務的執行體沒有返回值,則可以使用TransactionCallbackWithoutResultl類的實例。這是個抽象類,不能直接實例化,只能用於創建匿名內部類。它也是TransactionCallback 接口的子接口,該抽象類包含一個抽象方法: 
• void dolnTransactionWithoutResult(TransactionStatus status)該方法與dolnTransaction 的效果非常相似,區別在於該方法沒有返回值,即事務執行體無須返回值。 


example: 

transactionTemplate.execute(new TransactionCallback() { 
public Object doInTransaction(TransactionStatus status) { 
try{
    } 
catch (Exception e) { 

  finally { 

status.setRollbackOnly(); 
           ) 
); 





兩種Spring事務管理方式:編程式、聲明式。 

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

1.TransactionTempale採用和其他Spring模板,如JdbcTempalte和HibernateTemplate一樣的方法。它使用回調方法,把應用程序從處理取得和釋放資源中解脫出來。如同其他模板,TransactionTemplate是線程安全的。代碼片段: 

Object result = tt.execute(new TransactionCallback()...{  
public Object doTransaction(TransactionStatus status)...{  
updateOperation();  
return resultOfUpdateOperation();  
}  
}); 
使用TransactionCallback()可以返回一個值。如果使用TransactionCallbackWithoutResult則沒有返回值。 

2.也可以使用PlatformTransactionManager直接管理事務。簡單地通過一個bean引用給你的bean傳遞一個你使用的 PlatformTransaction對象。然後,使用TransactionDefinition和TransactionStatus對象就可以發起、回滾、提交事務。如下片段: 

DefaultTransactionDefinition def= new DefaultTransactionDefinition(); //new 一個事務              def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); //                                                    初始化事務,參數定義事務的傳播類型; TransactionStatus status =                                   transactionManager.getTransaction(def); //獲得事務狀態 try...{ ……………..                                 transactionManager.commit(status); //提交事務; }catch(…..)...{                                                   transactionManager.rollback(status); //回滾事務; }  
Spring也提供聲明式事務管理。這是通過AOP實現的。大多數Spring用戶選擇聲明式事務管理,這是最少影響應用代碼的選擇,因而這是和非侵入性的輕量級容器的觀念是一致的。 

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

<bean id="transactionService"class="org.springframework.                    transaction.interceptor.TransactionProxyFactoryBean"> 
<property name="transactionManager"> 
<ref   local="transactionManager"/> 
property> 
<property  name="target"> 
<ref  local="transactionServiceControl"/> 
property> 
<property  name="transactionAttributes"> 
<props> 
<prop key=”insert*”>PROPAGATION_REQUIRED,-MyCheckedExceptionprop> 
<prop key=”update*”>PROPAGATION_REQUIREDprop> 
<prop key=”*”>PROPAGATION_REQUIRED,readOnlyprop> 
props> 
property> 
bean> 
事務代理會實現目標對象的接口:這裏是屬性名是target的引用。id是transactionServiceControl。(使用CGLIB也可以實現具體類的代理。只要設置proxyTargetClass屬性爲true即可。如果目標對象沒有實現任何接口,這將自動設置該屬性爲true。通常,我們希望面向接口編程。)使用proxyInterfaces屬性來限定事務代理來代理指定接口也是可以。 也可以通過從org.springframework.aop.framework.ProxyConfig繼承或所有AOP代理工廠共享的屬性來定製 TransactionProxyFactoryBean行爲。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章