Spring事务管理方式

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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_REQUIR ED);//初始化事务,参数定义事务的传播类型;TransactionStatus status= transactionManager.getTransaction(def);//获得事务状态try...{…………….. mit(status);//提交事

务;}catch(…..)...{tra nsactionManager.rollback(status);//回滚事务;}

Spring也提供声明式事务管理。这是通过AOP实现的。大多数Spring用户选择声明式事务管理,这是最少影响应用代码的选择,因而这是和非侵入性的轻量级容器的观念是一致的。

1)通常通过TransactionProxyFactoryBean设置Spring事务代理。需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Javabean。当我们定义TransactionProxyFactoryBean时,必须提供一个相关的PlatformTransactionManager的引用和事务属性。事务属性含有事务定义。例如:

class="org.springframework.jdbc.datasource

.DataSourceTransactionManager">

property>

property>

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED,readOnly

事务代理会实现目标对象的接口:这里是属性名是target的引用。id是transactionServiceControl。(使用CGLIB也可以实现具体类的代理。只要设置proxyTargetClass属性为true即可。如果目标对象没有实现任何接口,这将自动设置该属性为true。通常,我们希望面向接口编程。)使用proxyInterfaces 属性来限定事务代理来代理指定接口也是可以。也可以通过从

org.springframework.aop.framework.ProxyConfig继承或所有AOP代理工厂共享的属性来定制TransactionProxyFactoryBean行为。

然后,说说属性名是transactionAttributes意义:

这里的transactionAttributes属性是定义在

MathTransactionAttributeS

ource中的属性格式设置。这个包括通配符的方法名称映射是很直观的,

如”insert*”。注意insert*的映射的值包括回滚规则。”-MyCheckException”指定

如果方法抛出MyCheckException或它的子类,事务会自动回滚。可以用逗号分隔多个回滚规则。“-”前缀强制回滚,“+”前缀指定提交(这允许即使抛出unchecked异常时也可以提交事务)。“PROPAGATION_REQUIRED”指定事务传播范围。

TransactionProxyFactoryBean允许你通过“preInterceptors”和“postInterceptors”属性设置前或后的拦截操作。可以设置任意数量的前和后通过,它们的类型可以是Advistor(切入点),MethodInterceptor或被当前Spring配置支持的通知类型。例如:ThrowAdvice,AfterReturningAdvice或BeforeAdvice。这些通知必须支持实例共享模式。如果你需要高级AOP特性操作事务,通过org.springframework.aop.framework.ProxyFactoryBean,而不是TransactionProxyFactory实用代理创建者。

2)另一种声明方式:BeanNameAutoProxyCreator

使用TransactionProxyFactoryBean当事务代理包装对象,你可以完全控制代理。如果需要用一致方式包装大量bean。使用一个BeanFactoryPostProcessor的

一个实现,BeanNameAutoProxyCreator,可以提供另外一种方法。(Spring中,一旦ApplicationContext读完它的初始化信息,它将初始化所有实现BeanPostProcessor接口的bean,并且让它们后处理ApplicationContext中所有其他的bean。所以使用这种机制,正确配置的BeanNameAutoProxyCreator 可以用来后处理所有ApplicationContext中所有其他的bean),并且把它们用事务代理包装起来。真正生成的事务代理和使用TransactionProxyFactoryBean生成的基本一致。

最后,总结一下Spring的优点:

◆为不同的事务API提供一致的编程模型,如JTA、JDBC、Hibernate、iBATIS 数据库层JDO

◆提供比大多数事务API更简单的、易于使用的编程式事务管理API

◆整合Spring数据访问抽象

◆支持Spring声明式事务管理

相关文档
最新文档