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行爲。
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行爲。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.