Spring针对事务处理提供哪两种事务编程模式。
两种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行为。
然后,说说属性名是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实用代理创建者。
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声明式事务管理
spring 事务实现方式有哪些?
第一种方式:每个Bean都有一个代理
bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
property name="configLocation" value="classpath:hibernate.cfg.xml" /
property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /
/bean
!-- 定义事务管理器(声明式的事务) --
bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
property name="sessionFactory" ref="sessionFactory" /
/bean
!-- 配置DAO --
bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"
property name="sessionFactory" ref="sessionFactory" /
/bean
bean id="userDao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
!-- 配置事务管理器 --
property name="transactionManager" ref="transactionManager" /
property name="target" ref="userDaoTarget" /
property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" /
!-- 配置事务属性 --
property name="transactionAttributes"
props
prop key="*"PROPAGATION_REQUIRED/prop
/props
/property
/bean
/beans
第二种方式:所有Bean共享一个代理基类
bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
property name="configLocation" value="classpath:hibernate.cfg.xml" /
property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /
/bean
!-- 定义事务管理器(声明式的事务) --
bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
property name="sessionFactory" ref="sessionFactory" /
/bean
bean id="transactionBase"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
lazy-init="true" abstract="true"
!-- 配置事务管理器 --
property name="transactionManager" ref="transactionManager" /
!-- 配置事务属性 --
property name="transactionAttributes"
props
prop key="*"PROPAGATION_REQUIRED/prop
/props
/property
/bean
!-- 配置DAO --
bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"
property name="sessionFactory" ref="sessionFactory" /
/bean
bean id="userDao" parent="transactionBase"
property name="target" ref="userDaoTarget" /
/bean
/beans
第三种方式:使用拦截器
bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
property name="configLocation" value="classpath:hibernate.cfg.xml" /
property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /
/bean
!-- 定义事务管理器(声明式的事务) --
bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
property name="sessionFactory" ref="sessionFactory" /
/bean
bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor"
property name="transactionManager" ref="transactionManager" /
!-- 配置事务属性 --
property name="transactionAttributes"
props
prop key="*"PROPAGATION_REQUIRED/prop
/props
/property
/bean
bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
property name="beanNames"
list
value*Dao/value
/list
/property
property name="interceptorNames"
list
valuetransactionInterceptor/value
/list
/property
/bean
!-- 配置DAO --
bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl"
property name="sessionFactory" ref="sessionFactory" /
/bean
/beans
第四种方式:使用tx标签配置的拦截器
bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
property name="configLocation" value="classpath:hibernate.cfg.xml" /
property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /
/bean
!-- 定义事务管理器(声明式的事务) --
bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
property name="sessionFactory" ref="sessionFactory" /
/bean
tx:advice id="txAdvice" transaction-manager="transactionManager"
tx:attributes
tx:method name="*" propagation="REQUIRED" /
/tx:attributes
/tx:advice
aop:config
aop:pointcut id="interceptorPointCuts"
expression="execution(* com.bluesky.spring.dao.*.*(..))" /
aop:advisor advice-ref="txAdvice"
pointcut-ref="interceptorPointCuts" /
/aop:config
/beans
第五种方式:全注
tx:annotation-driven transaction-manager="transactionManager"/
bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
property name="configLocation" value="classpath:hibernate.cfg.xml" /
property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /
/bean
!-- 定义事务管理器(声明式的事务) --
bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
property name="sessionFactory" ref="sessionFactory" /
/bean
/beans
spring的事务管理有几种方式实现,如何实现
实现方式共有两种:编码方式;声明式事务管理方式。
基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。
声明式事务管理又有两种方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。
spring事务管理几种方式
Spring提供了许多内置事务管理器实现,常用的有以下几种:
DataSourceTransactionManager(JDBC局部事务),
HibernateTransactionManager(Hibernate事务),
和JtaTransactionManager(JTA全局事务)。
Spring提供了两种事务管理方式:
编程式事务管理和声明式事务管理。
不推荐使用编程式事务管理,推荐使用声明式管理。
推荐两篇文章给你看:
这篇写的中规中矩,内容比较齐全。
这篇写的通俗易懂,入门者看着比较容易。