Spring事务管理

转载 2012年03月27日 21:15:53
 本文详细介绍Spring事务管理,包括Spring事务管理的两种方式——编程式和声明式
 
 在学习spring事务管理时,我忍不住要问,spring为什么进行事务管理,spring怎么进行的事务管理?首先,为什么要进行事务,接下来说说spring是怎样进行事务管理的.




Spring事务策略


Spring事务策略,也就是spring事务管理的实现方式.它有一个统一的抽象是由实现下面这个接口完成的.org.springframework.transaction.PlatformTransactionManager
此接口的内容如下:


Public interface PlatformTransactionManager()...{  
TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;  
Void commit(TransactionStatus status) throws TransactionException;  
Void rollback(TransactionStatus status) throws TransactionException;  

不管是声明式的还是编程式的事务管理都需要此抽象来完成.
解释一下这个接口,这样可以更好的理解spring的事务控制的原理.
getTransaction() 根据类型为TransactionDefinition的参数返回一个TransactionStatus对象.返回的 TransactionStatus对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务).如同J2EE事务上下文,一个 TransactionStatus也是和执行的线程关联的.
同时,在框架中还存在TransactionDefinition接口,即上边的参数类型.此接口指定了事务隔离程度、事务传播、事务超时、只读状态。
另外,还有TransactionStatus接口。这个接口为处理事务提供简单的控制事务执行和查询事务状态的方法。


两种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事务管理(详解+实例)

写这篇博客之前我首先读了《Spring in action》,之后在网上看了很多关于Spring事务管理的文章,具体参考文章如下: 1、将相应的接口依赖图理清出 2、将每个类的具体配置弄明白 3...
  • Trigl
  • Trigl
  • 2016年03月25日 23:20
  • 27734

Java事务管理之Spring+Hibernate

环境与版本除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate还需要加入Spring的lib 包和如下的一些依赖包org.aopallianceorg.aspectj...
  • oscar999
  • oscar999
  • 2017年02月16日 17:32
  • 1090

Spring事务管理及几种简单的实现

事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败,最为典型的就是银行转账的案例:A要向B转账,现在A,B各自账户中有1000元,A要给B转200元,那么这个转账就必须保证是一个事务,防止中途...
  • zhuxinquan61
  • zhuxinquan61
  • 2017年05月01日 22:30
  • 2838

Spring事务管理详解

Spring事务管理详解
  • donggua3694857
  • donggua3694857
  • 2017年04月09日 22:43
  • 3453

Spring事务管理的四种方式(以银行转账为例)

1.Spring事务管理   1)事务的作用   将若干的数据库操作作为一个整体控制,一起成功或一起失败。   原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。   一致...
  • daijin888888
  • daijin888888
  • 2016年07月04日 18:01
  • 15192

spring事务管理(个人整理)

一、异常分类及定义: Throwable是所有异常的根 Error(错误):继承自Error的类 NoSuchMethodError Exception:分为受检异常(checkExceptio...
  • u011332918
  • u011332918
  • 2016年03月16日 10:39
  • 1487

spring事务管理全面分析

在 Spring 中,事务是通过 TransactionDefinition 接口来定义的。该接口包含与事务属性有关的方法。具体如清单 1 所示: 清单 1. TransactionDefiniti...
  • u011239468
  • u011239468
  • 2016年04月04日 18:15
  • 366

Spring事务管理;hibernate事务管理;jdbc事务管理

Spring事务处理你未关注过的原理 本文对Spring实现事务处理的真正原理进行追究,从而从中提炼出一些见解。其中讲解内容可能会存在一定的误导,还希望指出,内容仅供参考!(经过本人后期继续研读Spr...
  • zhangyayun0991
  • zhangyayun0991
  • 2017年03月15日 23:34
  • 240

Spring整理系列(17)————循序渐进了解spring事务管理的几种方式

先从实例开始。。。。一、实例基本业务为银行转账,A账户向B账户转账,业务执行过程要保证A、B两个帐号数据操作同时成功或失败,此时就需要事务进行控制,基本实例代码如下:转账DAO:public inte...
  • javaloveiphone
  • javaloveiphone
  • 2016年08月22日 10:41
  • 2388

Spring支持的事务管理类型有什么?

Spring支持两种类型的事务管理: ·编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。 ·声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和...
  • qq_14927893
  • qq_14927893
  • 2018年01月28日 22:42
  • 34
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring事务管理
举报原因:
原因补充:

(最多只允许输入30个字)