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

 更新时间:2017年10月20日 10:08:08   作者:和大黄  
下面小编就为大家带来一篇浅谈Spring的两种事务定义方式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

一、声明式

这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxxUpdate等等。详细配置如下:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
  <property name="dataSource" ref="dataSource"></property> 
 </bean> 
  
 <!-- 定义事务通知 --> 
 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
  <!-- 定义方法的过滤规则 --> 
  <tx:attributes> 
   <!-- 所有方法都使用事务 --> 
   <tx:method name="*" propagation="REQUIRED"/> 
   <!-- 定义所有get开头的方法都是只读的 --> 
   <tx:method name="get*" read-only="true"/> 
  </tx:attributes> 
 </tx:advice> 
  
 <!-- 定义AOP配置 --> 
 <aop:config> 
  <!-- 定义一个切入点 --> 
  <aop:pointcut expression="execution (* com.test.services.impl.*.*(..))" id="services"/> 
  <!-- 对切入点和事务的通知,进行适配 --> 
  <aop:advisor advice-ref="txAdvice" pointcut-ref="services"/> 
 </aop:config> 

二、注解式

这种方法,只需要在Spring配置文件中定义一个事务管理对象(如DataSourceTransactionManager),然后加入<tx:annotation-driven/>节点,引用该事务管理对象,然后即可在需要进行事务处理的类和方法使用@Transactional进行标注。示例如下:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
  <property name="dataSource" ref="dataSource"></property> 
 </bean> 
 <!-- 声明使用注解式事务 --> 
 <tx:annotation-driven transaction-manager="transactionManager"/> 

三、<tx:annotation-driven/>

Spring提供的<tx:annotation-driven/>用于开启对注解事务管理的支持,从而能识别Bean类上的@Transactional注解元数据,其具有以下属性:

1、<tx:annotation-driven/>

transaction-manager:指定事务管理器名字,默认为transactionManager,当使用其他名字时需要明确指定;

proxy-target-class:表示将使用的代码机制,默认false表示使用JDK代理,如果为true将使用CGLIB代理

order:定义事务通知顺序,默认Ordered.LOWEST_PRECEDENCE,表示将顺序决定权交给AOP来处理。

2、@Transaction

Spring使用@Transaction来指定事务属性,可以在接口、类或方法上指定,如果类和方法上都指定了@Transaction,则方法上的事务属性被优先使用,具体属性如下:

value:指定事务管理器名字,默认使用<tx:annotation-driven/>指定的事务管理器,用于支持多事务管理器环境;

propagation:指定事务传播行为,默认为Required,使用Propagation.REQUIRED指定;

isolation:指定事务隔离级别,默认为“DEFAULT”,使用Isolation.DEFAULT指定;

readOnly:指定事务是否只读,默认false表示事务非只读;

timeout:指定事务超时时间,以秒为单位,默认-1表示事务超时将依赖于底层事务系统;

rollbackFor:指定一组异常类,遇到该类异常将回滚事务;

rollbackForClassname:指定一组异常类名字,其含义与<tx:method>中的rollback-for属性语义完全一样;

noRollbackFor:指定一组异常类,即使遇到该类异常也将提交事务,即不回滚事务;

noRollbackForClassname:指定一组异常类名字,其含义与<tx:method>中的no-rollback-for属性语义完全一样;

Spring提供的@Transaction注解事务管理内部同样利用环绕通知TransactionInterceptor实现事务的开启及关闭。

使用@Transactional注解事务管理需要特别注意以下几点:

如果在接口、实现类或方法上都指定了@Transactional 注解,则优先级顺序为方法>实现类>接口;

建议只在实现类或实现类的方法上使用@Transactional,而不要在接口上使用,这是因为如果使用JDK代理机制是没问题,因为其使用基于接口的代理;而使用使用CGLIB代理机制时就会遇到问题,因为其使用基于类的代理而不是接口,这是因为接口上的@Transactional注解是“不能继承的”;

在Spring代理机制下(不管是JDK动态代理还是CGLIB代理),“自我调用”同样不会应用相应的事务属性,其语义和<tx:tags>中一样;

默认只对RuntimeException异常回滚;

在使用Spring代理时,默认只有在public可见度的方法的@Transactional 注解才是有效的,其它可见度(protected、private、包可见)的方法上即使有@Transactional 注解也不会应用这些事务属性的,Spring也不会报错,如果你非要使用非公共方法注解事务管理的话,可考虑使用AspectJ。

以上这篇浅谈Spring的两种事务定义方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot开发技巧启动时配置校验实现示例

    SpringBoot开发技巧启动时配置校验实现示例

    这篇文章主要为大家介绍了SpringBoot开发在启动时自动配置校验的实现示例及原理解析,有需要的朋友可以借鉴参考下希望能够有所帮助
    2021-10-10
  • 消息中间件详解以及比较选择

    消息中间件详解以及比较选择

    这篇文章主要介绍了消息中间件详解以及比较选择,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 详解HTTP请求与响应基础及实例

    详解HTTP请求与响应基础及实例

    这篇文章主要介绍了详解HTTP请求与响应基础及实例的相关资料,这里对http的请求和响应进行详细分析并附有实现实例,需要的朋友可以参考下
    2017-07-07
  • Java基于直方图应用的相似图片识别实例

    Java基于直方图应用的相似图片识别实例

    这篇文章主要介绍了Java基于直方图应用的相似图片识别实例,是非常实用的技巧,多见于图形里游戏中,需要的朋友可以参考下
    2014-09-09
  • Java 不使用第三方变量交换两个变量值的四种方法详解

    Java 不使用第三方变量交换两个变量值的四种方法详解

    这篇文章主要介绍了四种不使用第三方变量交换两个变量值的方法。文中对于四种方法进行了详细的分析,需要的小伙伴们可以跟随小编一起学习一下
    2021-12-12
  • spring boot 日志配置详解

    spring boot 日志配置详解

    本篇文章主要介绍了spring boot 日志配置 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • springboot集成mybatis实例代码

    springboot集成mybatis实例代码

    本篇文章主要介绍了springboot集成mybatis实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Django rest framework使用类视图实现首页API

    Django rest framework使用类视图实现首页API

    这篇文章主要介绍了Django rest framework使用类视图实现首页API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java中的NumberFormatException异常原因以及解决方案详解

    Java中的NumberFormatException异常原因以及解决方案详解

    这篇文章主要介绍了Java中的NumberFormatException异常原因以及解决方案详解,NumberFormatException 是 Java 中的一个异常类,通常在字符串转换为数字的过程中发生,它表示一个无效的数字格式,即字符串无法被正确解析为数字,需要的朋友可以参考下
    2024-02-02
  • SpringDataJpa的使用之一对一、一对多、多对多 关系映射问题

    SpringDataJpa的使用之一对一、一对多、多对多 关系映射问题

    这篇文章主要介绍了SpringDataJpa的使用 -- 一对一、一对多、多对多关系映射,本文主要讲述 @OneToOne、@OneToMany、@ManyToOne、@ManyToMany 这四个关系映射注解的使用,以及其对应的级联关系,需要的朋友可以参考下
    2022-07-07

最新评论