`
wtnhwbb
  • 浏览: 164408 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring参考手册 事务管理

阅读更多
pring对事务管理提供完整的支持,包括:
        提供一致的编程模型。
        支持声明式事务管理。
        支持简单的API来编程事务管理,而不用和类似JTA一样复杂的事务管理API打交道。
        和Spring的抽象数据源较好地整合。
核心概念

        Spring事务抽象的核心理念基于事务策略语义,事务策略通过 org.springframework.transaction.PlatformTransactionManager接口定义

java 代码
  1. public interface PlatformTransactionManager {   
  2. TransactionStatus getTransaction(TransactionDefinition definition)   
  3. throws TransactionException;   
  4. void commit(TransactionStatus status) throws TransactionException;   
  5. void rollback(TransactionStatus status) throws TransactionException;   
  6. }  

        getTransaction (..)方法根据TransactionDefinition参数返回TransactionStatus对象,返回的 TransactionStatus可以表示一个新的或已经存在的事务。TransactionDefinition接口指定如下信息:
                隔离级别
                事务传播性,用来指定当一个事务方法执行在一个存在的事务上下文时,是继续运行在现有的上下文,还是创建一个新的事务。
                指定事务超时
                指定只读状态

        TransactionStatus接口提供一些简单的方式用来控制事务执行和查询事务状态。

        Spring提供几个缺省的事务管理器实现,包括DataSourceTransactionManager,HibernateTransactionManager和JtaTransactionManager,这些事务管理器适用于不同的应用场景。

资源同步

        如何使用持久API,比如JDBC,JTA,HIBERNATE,正确处理资源的创建,清理以及通过PlatformTransactionManager触发事务同步呢?

        最 好的办法是使用Spring提供的高层持久层API,这些API不是原生API的替换,而是在内部使用原生API处理资源创建,重用,清除,事务同步以及 异常映射,这样用户的数据访问代码不必关心这些底层细节。这些高层API都基于模板实现,比如JDBCTemplate, HibernateTemplate。

        也 可以使用底层一点的类,比如DataSourceUtils,SessionFactoryUtils, PersistenceManagerFactoryUtils。如果应用程序需要直接处理原生API提供的资源类型,这些类提供获取容器管理的实例,事 务同步和异常映射的功能。

声明式事务管理

        Spring2.0可以不再使用TransactionProxyFactoryBean来配置声明式事务。

EJB事务/Spring事务

EJB声明事务绑定到JTA,而Spring事务可以运行在任何环境。
        Spring事务可以应用到任何类,而不是限制在EJB。
        Spring提供声明式回滚规则,可以指定哪个异常将导致事务回滚,而EJB事务只能在发生系统异常时回滚事务。
        Spring可以使用AOP提供自定义事务处理。
        Spring不支持跨远程调用的事务传播,EJB提供这个特性,但是通常不应该让事务跨越远程调用。

Spring的声明式事务管理基于AOP代理,事务Advice是基于XML驱动的。Spring会基于事务配置元信息,合适的 PlatformTransactionManager和TransactionInterceptor生成一个AOP代理,驱动Around方式的事务 Advice。

配置Spring事务

       下面的示例描述了一个典型的声明式事务设置,首先需要包含对http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd的引用,然后使用tx:advice定义事务Advice以及事务属性,最后使用aop:config定义advicor。

xml 代码
  1. <!---->  
  2. xml version="1.0" encoding="UTF-8"?>  
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5. xmlns:aop="http://www.springframework.org/schema/aop"  
  6. xmlns:tx="http://www.springframework.org/schema/tx"  
  7. xsi:schemaLocation="   
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.Transaction management   
  9. Spring Framework (2.0.2) 177   
  10. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd   
  11. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">  
  12. <!---->  
  13. <bean id="fooService" class="x.y.service.DefaultFooService"/>  
  14. <!---->  
  15. <tx:advice id="txAdvice" transaction-manager="txManager">  
  16. <!---->  
  17. <tx:attributes>  
  18. <!---->  
  19. <tx:method name="get*" read-only="true"/>  
  20. <!---->  
  21. <tx:method name="*"/>  
  22. <!---->tx:attributes>  
  23. <!---->tx:advice>  
  24.  
  25. <aop:config>  
  26. <aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/>  
  27. <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>  
  28. <!---->aop:config>  
  29. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  30. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>  
  31. <property name="url" value="jdbc:oracle:thin:@rj-t42:1521:elvis"/>  
  32. <property name="username" value="scott"/>  
  33. <property name="password" value="tiger"/>  
  34. <!---->bean>  
  35.  
  36. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  37. <property name="dataSource" ref="dataSource"/>  
  38. <!---->bean>  
  39.  
  40. <!---->beans>  
定义回滚规则

       Spring缺省在发生unchecked异常的时候回滚 事务,也提供支持,可以自定义在抛出特定异常时回滚事务,下面示例配置在捕获NoProductInStockException时回滚事务。

xml 代码
  1. <tx:advice id="txAdvice" transaction-manager="txManager">  
  2. <tx:attributes>  
  3. <tx:method name="get*" read-only="false" rollback-for="NoProductInStockException"/>  
  4. <tx:method name="*"/>  
  5. tx:attributes>  
  6. tx:advice>  

也可以使用编程的方式回滚事务,示例代码如下:

java 代码
  1. public void resolvePosition() {   
  2. try {   
  3. // some business logic...   
  4. catch (NoProductInStockException ex) {   
  5. // trigger rollback programmatically   
  6. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();   
  7. }   
  8. }  
Tx:advice设置

       Propagation……事务传播,缺省值为Required。
       Isolation……隔离级别,缺省值为Default。
       rollback-for……指定捕获哪些异常时需要回滚事务
       no-rollback-for……指定捕获哪些异常时不需要回滚事务
       timeout……指定事务超时,缺省为-1。
       read-only……指定事务是否是只读的,缺省为false

@Transaction注记

       Spring支持使用注记声明事务语义,前提是必须使用JDK 5。要使用事务注记,只需要添加合适的注记到类或者方法上,然后在上下文中添加如下配置即可:

xml 代码
  1. <tx:annotation-driven transaction-manager="txManager"/>  

       需要注意的是,@Transaction注记可以标注在接 口,类和方法上,但是推荐使用在具体类上,因为注记是不能继承的,如果Spring使用基于类的代理(CGLIB),事务声明将不会生效。

编程事务管理

       有两种方式通过编程实现事务管理
              使用TransactionTemplate类
              直接使用PlatformTransactionManager类。

分享到:
评论

相关推荐

    Spring2中文参考手册

    在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去...

    Spring 2.0 开发参考手册

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. ...

    Spring2.5 Framework 开发参考手册中文版

    Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。Spring提供了全功能的 MVC framework, 以及透明集成AOP到你...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 ...

    Spring Framework 开发参考手册

    另外,必须感谢Christian Bauer(来自Hibernate团队) ,他改写了DocBook-XSL软件来创建Hibernate参考手册,我们才得以创建这份文档。 也需要感谢Russell Healy为本手册的部分内容进行的详细而极富价值的审核。

    Spring2.0开发参考手册

    在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去...

    spring2.0中文开发参考手册

    在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去...

    Spring2.52 开发手册

    spring2.52 Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。...这份手册提供Spring的功能参考指南。

    spring2.0开发参考手册

    在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去...

    Spring2.5参考手册

    Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。

    Java Spring Framework 平台参考手册(916页完整版)

    作为应用程序开发人员,如何从Spring平台中获益的示例:•使Java方法在数据库事务中执行,而不必处理事务API。 •使本地Java方法成为HTTP端点,而无需处理Servlet API。 •使本地Java方法成为消息处理程序,而无需...

    spring.net中文手册在线版

    14.5.1.理解Spring.NET声明式事务管理的实现 14.5.2.第一个例子 14.5.3.Transaction特性的设置 14.5.4.通过AutoProxyCreator使用声明式事务 14.5.5.通过TransactionProxyFactoryObject使用声明式事务 14.5.6. 通过...

    spring2.5.chm帮助文档(中文版)

    Spring Framework 开发参考手册 目录 1. 简介 1.1. 概览 1.1.1. 使用场景 2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的...

    Spring2.0宝典 源码

    Spring是目前最流行的J2EE框架,在J2EE应用的各层都有其不俗的表现。Spring提倡的“实用主义”法则大大简化了J2EE的开发。  本书由浅入深、全面...本书既可以作为Spring的学习指南,也可作为实际开发人员的参考手册。

    spring chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...

    Spring API

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

    spring完全学习实例(一)

    针对《spring framework参考手册》来实现实例,几乎涵盖了全部Spring的J2EE开发。主要包括Spring的IoC、AOP(注释注入、Schema注入、与AspectJ的集成、有接口和无接口的实现的界面编程)、中间数据访问层(编程事...

Global site tag (gtag.js) - Google Analytics