`
zwdsmileface
  • 浏览: 155291 次
社区版块
存档分类
最新评论

springMVC注解——@Transactional

阅读更多
Spring作为低侵入的Java EE框架之一,能够很好地与其他框架进行整合,其中Spring与Hibernate的整合实现的事务管理是常用的一种功能。  
所谓事务,就必须具备ACID特性,即原子性、一致性、隔离性和持久性
注意@Transactional 注解及其支持类所提供的功能最低要求使用Java 5(Tiger)。
除了基于XML文件的声明式事务配置外,你也可以采用基于注解式的事务配置方法。直接在Java源代码中声明事务语义的做法让事务声明和将受其影响的代码距离更近了,而且一般来说不会有不恰当的耦合的风险,因为,使用事务性的代码几乎总是被部署在事务环境中。

下面的例子很好地演示了 @Transactional 注解的易用性,随后解释其中的细节。先看看其中的类定义:
<!-- the service class that we want to make transactional -->
@Transactional
public class DefaultFooService implements FooService {
       Foo getFoo(String fooName);
       Foo getFoo(String fooName, String barName);
       void insertFoo(Foo foo);
       void updateFoo(Foo foo);
}
当上述的POJO定义在Spring IoC容器里时,上述bean实例仅仅通过一 行xml配置就可以使它具有事务性的。如下:

<!-- from the file 'context.xml' -->
           
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

  <!-- this is the service object that we want to make transactional -->
  <bean id="fooService" class="x.y.service.DefaultFooService"/>

  <!-- enable the configuration of transactional behavior based on annotations -->
  <tx:annotation-driven transaction-manager="txManager"/>

  <!-- a PlatformTransactionManager is still required -->
  <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- (this dependency is defined somewhere else) -->
    <property name="dataSource" ref="dataSource"/>
  </bean>

  <!-- other <bean/> definitions here -->
</beans>

提示
实际上,如果你用 'transactionManager' 来定义 PlatformTransactionManager bean的名字的话,你就可以忽略 <tx:annotation-driven/> 标签里的 'transaction-manager' 属性。 如果 PlatformTransactionManager bean你要通过其它名称来注入的话,你必须用 'transaction-manager' 属性来指定它,如上所示。

方法的可见度和 @Transactional

@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。然而,请注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 <tx:annotation-driven/>元素的出现 开启 了事务行为。

Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。
注意
当使用 @Transactional 风格的进行声明式事务定义时,你可以通过 <tx:annotation-driven/> 元素的 "proxy-target-class" 属性值来控制是基于接口的还是基于类的代理被创建。如果 "proxy-target-class" 属值被设置为 "true",那么基于类的代理将起作用(这时需要CGLIB库cglib.jar在CLASSPATH中)。如果 "proxy-target-class" 属值被设置为 "false" 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。
在多数情形下,方法的事务设置将被优先执行。在下列情况下,例如: DefaultFooService 类被注解为只读事务,但是,这个类中的 updateFoo(Foo) 方法的 @Transactional 注解的事务设置将优先于类级别注解的事务设置。
@Transactional(readOnly = true)
public class DefaultFooService implements FooService {

    public Foo getFoo(String fooName) {
        // do something
    }

    // these settings have precedence for this method
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public void updateFoo(Foo foo) {
        // do something
       
    }
}

@Transactional 有关的设置
@Transactional 注解是用来指定接口、类或方法必须拥有事务语义的元数据。 如:“当一个方法开始调用时就开启一个新的只读事务,并停止掉任何现存的事务”。 默任的@Transactional 设置如下:
事务传播设置是 PROPAGATION_REQUIRED
事务隔离级别是 ISOLATION_DEFAULT
事务是 读/写
事务超时默认是依赖于事务系统的,或者事务超时没有被支持。
任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚
这些默认的设置当然也是可以被改变的。 @Transactional 注解的各种属性设置总结如下:

属性 类型 描述
传播性 枚举型:Propagation 可选的传播性设置
隔离性 枚举型:Isolation 可选的隔离性级别(默认值:ISOLATION_DEFAULT)
只读性 布尔型 读写型事务 vs. 只读型事务
超时 int型(以秒为单位) 事务超时
回滚异常类(rollbackFor) 一组 Class 类的实例,必须是Throwable 的子类 一组异常类,遇到时 必须 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException的子类)才进行事务回滚。
回滚异常类名(rollbackForClassname) 一组 Class 类的名字,必须是Throwable的子类 一组异常类名,遇到时 必须 进行回滚
不回滚异常类(noRollbackFor) 一组 Class 类的实例,必须是Throwable 的子类 一组异常类,遇到时 必须不 回滚。
不回滚异常类名(noRollbackForClassname) 一组 Class 类的名字,必须是Throwable 的子类 一组异常类,遇到时 必须不 回滚
3
3
分享到:
评论

相关推荐

    transDemo.zip

    《Spring声明式事务管理详解——基于tx和aop命名空间的XML配置及@Transactional注解》 在企业级应用开发中,事务管理是至关重要的,它确保数据的一致性和完整性。Spring框架提供了两种主要的事务管理方式:编程式...

    spring mvc + spring + hibernate 全注解整合开发视频教程 05

    在本视频教程“Spring MVC + Spring + Hibernate 全注解整合开发 05”中,我们将深入探讨Java企业级开发中的三大核心技术——Spring MVC、Spring和Hibernate的集成应用,特别是如何利用注解进行高效无XML配置的开发...

    spring mvc + spring + hibernate 全注解整合开发视频教程 04

    在本视频教程“Spring MVC + Spring + Hibernate 全注解整合开发视频教程 04”中,我们将深入探讨Java企业级开发中的三大核心技术——Spring、Spring MVC和Hibernate的集成与应用,尤其是通过注解实现的简化配置。...

    springMVC+MYBATIS事务管理

    在SpringMVC+MyBatis的应用中,通常会在Service层方法上添加@Transactional注解,指定事务属性如隔离级别、传播行为等。当方法执行过程中出现异常时,Spring会自动回滚事务;若无异常,事务将在方法结束时提交。 4....

    3springmvc面试题

    - **示例**:使用`@Transactional(propagation = Propagation.REQUIRED)`注解来标记方法,指定事务的传播行为。 - **优点**:提高了代码的可读性和可维护性,减少了事务管理的模板代码。 通过以上对Spring MVC的...

    Spring+hibernate 单元测试

    Spring 2.5 版本引入了一个全新的基于注解的测试框架——TestContext,该框架与之前的测试框架相比有着显著的区别。TestContext 测试框架不再依赖于特定的测试基类,而是采用了更加灵活的注解方式来定义测试行为,这...

    SpringBoot第 8 讲:SpringBoot+JPA

    SpringBoot默认使用`@Transactional`注解来管理事务,它可以在方法级别进行声明,确保数据库操作的原子性。当方法中发生异常时,事务会回滚,确保数据一致性。 此外,JPA还支持查询语言——JPQL(Java Persistence ...

    ssm——mybatis整理相关代码

    5. **事务管理**:在Spring中,我们可以使用`@Transactional`注解来声明事务边界。MyBatis的事务管理器(PlatformTransactionManager)会根据配置自动提交或回滚事务。 6. **MyBatis的动态SQL**:MyBatis允许在XML...

    BookSystem.zip

    1. **事务管理**:Spring支持声明式事务管理,通过@Transactional注解,可以在方法级别控制事务的开始、提交、回滚。这对于数据一致性至关重要。 2. **拦截器**:SpringMVC中的拦截器可以进行预处理和后处理,例如...

    baobaotao源码springmvc+spring+springjdbc技术栈maven配置

    事务管理方面,可以使用PlatformTransactionManager Bean,并在Service层的方法上添加@Transactional注解,以开启事务支持。 在"宝宝套"项目中,登录操作的实现可能涉及到Controller接收请求,Service层处理业务...

    ssm订单项目源码-附加数据库

    SSM订单项目源码是基于三大主流Java框架——Spring、SpringMVC和MyBatis构建的一个典型企业级应用。这个项目的核心目标是实现一个完整的订单处理系统,它涵盖了从用户下单到订单处理的整个流程。下面我们将深入探讨...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    8.4.4 类级别使用@Transactional 300 8.4.5 Spring Data JPA 的事务支持 300 8.4.6 Spring Boot 的事务支持 302 8.4.7 实战 303 8.5 数据缓存Cache 309 8.5.1 Spring 缓存支持 309 8.5.2 Spring Boot 的支持 310 ...

    jpetstore.zip

    4. **实现事务管理**:利用Spring的声明式事务管理,通过@Transactional注解来控制事务的边界,确保数据的一致性。 5. **测试与优化**:完成上述改造后,进行单元测试和整体功能测试,确保所有功能正常运行。同时,...

    电影院售票系统

    2. **声明式事务管理**:更常见的方式是使用`@Transactional`注解,它可以在方法级别声明事务边界,简化事务管理。Spring会自动处理事务的开启、提交或回滚,根据异常情况决定是否回滚。 三、具体实现与优化 在...

    Java SSM service层配置文件

    在SSM(Spring、SpringMVC、MyBatis)架构中,Service层作为业务逻辑的核心,它的配置文件——`applicationContext-service.xml`扮演着至关重要的角色。 `applicationContext-service.xml`文件是用来配置Service层...

Global site tag (gtag.js) - Google Analytics