`
flysnail
  • 浏览: 92851 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

浅谈Spring事务管理配置

阅读更多
大多数Spring用户选择声明式事务管理。这是对应用代码影响最小的选择,因此也最符合非侵入式 轻量级容器的理念。

Spring的声明式事务管理是通过Spring AOP实现的,因为事务方面的代码与Spring绑定并以一种样板式风格使用,不过尽管如此,你一般并不需要理解AOP概念就可以有效地使用Spirng的声明式事务管理。

从考虑EJB CMT和Spring声明式事务管理的相似以及不同之处出发是很有益的。它们的基本方法是相似的:都可以指定事务管理到单独的方法;如果需要可以在事务上下文调用 setRollbackOnly() 方法。不同之处在于:

不像EJB CMT绑定在JTA上,Spring声明式事务管理可以在任何环境下使用。只需更改配置文件,它就可以和JDBC、JDO、Hibernate或其他的事务机制一起工作。

Spring的声明式事务管理可以被应用到任何类(以及那个类的实例)上,不仅仅是像EJB那样的特殊类。

Spring提供了声明式的回滚规则:EJB没有对应的特性,我们将在下面讨论。回滚可以声明式的控制,不仅仅是编程式的。

Spring允许你通过AOP定制事务行为。例如,如果需要,你可以在事务回滚中插入定制的行为。你也可以增加任意的通知,就象事务通知一样。使用EJB CMT,除了使用setRollbackOnly(),你没有办法能够影响容器的事务管理。

Spring不提供高端应用服务器提供的跨越远程调用的事务上下文传播。如果你需要这些特性,我们推荐你使用EJB。然而,不要轻易使用这些特性。通常我们并不希望事务跨越远程调用。

TransactionProxyFactoryBean在哪儿?

Spring2.0及以后的版本中声明式事务的配置与之前的版本有相当大的不同。主要差异在于不再需要配置TransactionProxyFactoryBean了。

Spring2.0之前的旧版本风格的配置仍然是有效的;你可以简单地认为新的<tx:tags/>替你定义了TransactionProxyFactoryBean。
回滚规则的概念比较重要:它使我们能够指定什么样的异常(和throwable)将导致自动回滚。我们在配置文件中声明式地指定,无须在Java代码中。同时,我们仍旧可以通过调用 TransactionStatus 的 setRollbackOnly() 方法编程式地回滚当前事务。通常,我们定义一条规则,声明 MyApplicationException 必须总是导致事务回滚。这种方式带来了显著的好处,它使你的业务对象不必依赖于事务设施。典型的例子是你不必在代码中导入Spring API,事务等。

对EJB来说,默认的行为是EJB容器在遇到 系统异常(通常指运行时异常)时自动回滚当前事务。EJB CMT遇到 应用异常(例如,除了 java.rmi.RemoteException 外别的checked exception)时并不会自动回滚。默认式Spring处理声明式事务管理的规则遵守EJB习惯(只在遇到unchecked exceptions时自动回滚),但通常定制这条规则会更有用。

配置事例:

public interface ObjectService
{
    
    List<Object>  getObject (String objectName, String barName);

    void insertObject (Object object);

    void updateObject (Object object);

}

package com.spring.transaction.exampleservice

public class ExampleObjectService implements  ObjectService
{
     List<Object>  getObject (String objectName, String barName);
    {
         throw new UnsupportedOperationException();
    }

    void insertObject (Object object)
    {
         throw new UnsupportedOperationException();
    }

    void updateObject (Object object)
    {
          throw new UnsupportedOperationException();
    }
}

如果你想在get(String,String) method中必须执行在只读事务上下文中,其余方法(insertObject(Object)和updateObject(Object))必须执行在读写事务上下文中。我们可以对抛出的 Exception类型进行事务回滚
在Spring 中配置关键配置如下:

  <bean id="objectService" class="com.spring.transaction.exampleservice.ExampleObjectService "/>
  <!-- the transactional advice (i.e. what 'happens'; see the <aop:advisor/> bean below) -->
  <tx:advice id="txAdvice" transaction-manager="txManager">
    <!-- the transactional semantics... -->
    <tx:attributes>
      <!-- all methods starting with 'get' are read-only -->
      <tx:method name="get*" read-only="true" rollback-for="NoProductInStockException"/>
      <!-- other methods use the default transaction settings (see below) -->
      <tx:method name="*"/>
    </tx:attributes>
  </tx:advice>

  <!-- ensure that the above transactional advice runs for any execution
      of an operation defined by the FooService interface --> 
  <aop:config>
    <aop:pointcut id="objectServiceOperation" expression="execution(* com.spring.transaction.exampleservice.ExampleObjectService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="objectServiceOperation"/>
  </aop:config>

分享到:
评论

相关推荐

    浅谈Spring事务传播行为实战

    浅谈Spring事务传播行为实战 Spring框架提供了事务管理的标准实现,通过注解或者XML文件的方式声明和配置事务。事务管理是指按照给定的事务规则来执行事务的提交或者回滚操作。事务的机制实现很大一部依赖事务日志...

    浅谈Spring+Hibernate整合(共16页).doc

    3. 在 Spring 的配置文件中,定义 SessionFactory Bean,以及事务管理器 Bean。 4. 创建 DAO 类,使用 HibernateTemplate 或者 SessionFactory 进行数据库操作。 5. 配置事务管理,可以选择编程式或声明式。 6. 在...

    浅谈SpringBoot之事务处理机制

    浅谈SpringBoot之事务处理机制 SpringBoot之事务处理机制是Spring框架中的一种机制,用于管理事务。事务是指一系列的数据库操作,例如插入、更新、删除等,事务处理机制的目的就是为了确保这些操作的原子性、一致性...

    浅谈Spring Data如何简化数据操作的方法

    配置完成后,Spring Data将自动管理数据库连接,处理事务,并提供数据访问对象(DAO)的自动创建。 总的来说,Spring Data通过以下方式简化数据操作: 1. **声明式编程**:开发者只需声明持久层接口,无需编写实现...

    浅谈Spring的两种事务定义方式

    浅谈Spring的两种事务定义方式 Spring框架提供了两种事务定义方式:声明式和注解式。下面我们将深入探讨这两种方式的实现和应用。 声明式事务 声明式事务是通过在XML文件中定义需要拦截方法的匹配来完成配置的。...

    浅谈MyBatis 事务管理

    浅谈MyBatis事务管理 MyBatis是一款优秀的持久层框架,它提供了强大的事务管理机制,帮助开发者轻松地管理数据库事务。在这篇文章中,我们将深入探讨MyBatis的事务管理机制,了解它的运行环境、事务抽象、事务管理...

    浅谈Spring中@Transactional事务回滚及示例(附源码)

    浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...

    浅谈spring中isolation和propagation的用法

    浅谈Spring中isolation和propagation的用法 在Spring中,isolation和propagation是两个非常重要的概念,它们都是事务管理的核心组件。事务管理是指在数据库中执行一系列操作,以确保数据的一致性和完整性。在Spring...

    浅谈SSH学习要点

    在进阶阶段,Spring与Struts和Hibernate的整合是提升整体应用效能的关键,例如通过Spring管理Struts的Action和Hibernate的SessionFactory,实现统一的事务管理,这样不仅可以减少代码量,还能增强系统的稳定性和可...

    浅谈Springboot之于Spring的优势

    浅谈Springboot之于Spring的优势 ...同时,也欢迎各位参阅本站其他相关专题,如Spring的编程式事务和声明式事务详解、Spring spel表达式使用方法示例、浅谈Spring Boot微服务项目的推荐部署方式等。

    浅谈SpringMVC+Spring3+Hibernate4开发环境搭建

    Spring3是Spring框架的一个版本,它提供了依赖注入、AOP(面向切面编程)、事务管理等功能,使得开发者可以更加专注于业务逻辑而不是底层实现。在配置中,我们通常会创建一个`contextConfigLocation`参数,指向...

    浅谈java代理机制 .txt

    ### 浅谈Java代理机制 #### 一、引言 在深入探讨Java代理机制之前,我们首先需要了解代理模式的基本概念及其应用场景。代理模式是一种结构型设计模式,它为其他对象提供了一种代理以控制对这个对象的访问。在Java...

    浅谈利用Spring的AbstractRoutingDataSource解决多数据源的问题

    这通常可以通过Spring的AOP(面向切面编程)来实现,例如在事务开始时设置数据源,事务结束后清除。通过编写一个切面类,使用`@Before`和`@After`注解,可以在方法执行前后分别设置和清除数据源。 ```java @Aspect ...

    浅谈Struts2拦截器的原理与实现.docx

    在这个配置中,`struts.objectFactory`设置为"spring",这意味着我们将使用Spring来管理Struts2的依赖注入。`package`元素定义了一个默认的包,其中包含了我们的拦截器和Action配置。`interceptor`元素定义了自定义...

    浅谈Java三大框架与应用

    Spring还提供了一个AOP(面向切面编程)框架,使得事务管理、日志记录等横切关注点能够以声明式的方式实现。此外,Spring的MVC框架简化了Web应用的开发,它支持RESTful风格的URL设计,提供了模型-视图-控制器结构的...

    浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件

    过滤器适用于全局的请求预处理和后处理,如安全检查、内容编码转换等,而拦截器更适合处理与SpringMVC控制器相关的逻辑,如登录验证、事务管理。了解何时使用过滤器,何时使用拦截器,能够帮助开发者构建更高效、更...

Global site tag (gtag.js) - Google Analytics