首页>>后端>>Spring->spring事务管理的方式有几种?

spring事务管理的方式有几种?

时间:2023-12-01 本站 点击:0

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提供了两种事务管理方式:

编程式事务管理和声明式事务管理。

不推荐使用编程式事务管理,推荐使用声明式管理。

推荐两篇文章给你看:

这篇写的中规中矩,内容比较齐全。

这篇写的通俗易懂,入门者看着比较容易。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Spring/6008.html