关闭

Spring 中的TransactionTemplate

标签: spring事务
321人阅读 评论(0) 收藏 举报
分类:
使用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行为。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10172次
    • 积分:164
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:10篇
    • 译文:0篇
    • 评论:0条
    文章分类