spring 注解 事务,声明事务共存的情况下,先后顺序

2024-06-11 18:38

本文主要是介绍spring 注解 事务,声明事务共存的情况下,先后顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

COME FROM

首先先看配置文件:

[html]  view plain copy
  1. <!-- hibernate -->  
  2.     <bean id="sessionFactory"  
  3.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  4.         <property name="dataSource" ref="dataSource" />  
  5.         <property name="hibernateProperties">  
  6.             <props>  
  7.                 <prop key="hibernate.hbm2ddl.auto">update</prop>  
  8.                 <prop key="hibernate.show_sql">true</prop>  
  9.                 <prop key="hibernate.format_sql">true</prop>  
  10.                 <prop key="connection.autoReconnect">true</prop>  
  11.                 <prop key="connection.autoReconnectForPools">true</prop>  
  12.                 <prop key="connection.is-connection-validation-required">true</prop>  
  13.                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
  14.             </props>  
  15.         </property>  
  16.         <property name="mappingDirectoryLocations">  
  17.             <list>  
  18.                 <value>classpath*:*oddtech/bean</value>  
  19.             </list>  
  20.         </property>  
  21.     </bean>  
  22.   
  23.     <!-- 事務管理 -->  
  24.     <bean id="txManager"  
  25.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  26.         <property name="sessionFactory" ref="sessionFactory" />  
  27.     </bean>  
  28.     <!-- 註解式事務的支持 -->  
  29.     <tx:annotation-driven transaction-manager="txManager"  order="0"/>  
  30.     <!-- 服務事務註冊切面 -->  
  31.     <aop:config >  
  32.         <aop:pointcut expression="execution(* oddtech.service.impl.*.*(..))"  
  33.             id="txPoint"  />  
  34.         <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"  order="1"/>  
  35.     </aop:config>  
  36.   
  37.       
  38.   
  39.   
  40.     <tx:advice transaction-manager="txManager" id="txAdvice">  
  41.         <tx:attributes >  
  42.             <tx:method name="find*" propagation="REQUIRED" read-only="true"   
  43.                 rollback-for="Exception" />  
  44.             <tx:method name="select*" propagation="REQUIRED" read-only="true"  
  45.                 rollback-for="Exception" />  
  46.             <tx:method name="insert*" propagation="REQUIRED"    
  47.                 rollback-for="Exception" />  
  48.             <tx:method name="delete*" propagation="REQUIRED"  
  49.                 rollback-for="Exception" />  
  50.             <tx:method name="update*" propagation="REQUIRED"   
  51.                 rollback-for="Exception" />  
  52.             <tx:method name="modify*" propagation="REQUIRED"  
  53.                 rollback-for="Exception" />  
  54.             <tx:method name="*" read-only="true"  
  55.                 rollback-for="Exception" />  
  56.         </tx:attributes>  
  57.     </tx:advice>  

当在oddtech.service.impl包下某个类(Test)某个方法(insert)使用了@Transactional,相当于在执行new Test().insert() 方法执行2次AOP切面。那么我们需要通过order 属性去定义AOP切面的先后执行顺序。 order越小,在AOP的chain 中越靠前,越先执行。(chain模式)


所以 我们需要在<tx:annotation-driven transaction-manager="txManager"  order="0"/>中加入order属性为0,<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"  order="1"/>加入order 属性为1.那么他们两个的执行顺序如下:

。这样就属于事务嵌套。

那么我们再看上边说的例子:当在oddtech.service.impl包下某个类(Test)某个方法(insert)使用了@Transactional,那么我们想让insert 方法只读,read-only=true,那么我们需要这样去定义:@Transactional(readOnly = true,propagation=Propagation.REQUIRED),为什么呢?

在声明事务中,我们对insert 的事务传播级别定义为:REQUIRED,关于事务传播级别,请参照http://blog.csdn.net/feng27156/article/details/8534609,那么在注解事务中我们定义REQUIRED 的事务。声明事务在使用注解定义的事务级别。

除非在特殊的情况下,注解事务不要和声明事务有冲突。声明事务定义的是统一的规则,如果你想让某一个方法有特殊的事务传播机制的话,那么不要和统一的规则有冲突。

<tx:method name="*" read-only="true" rollback-for="Exception" />

按照規則,定義一個test方法,加入:@Transactional定義。则test 方法爲read-only=false,propagation=REQUIRED。這是默認的。統一規則<tx:method name="*" read-only="true" rollback-for="Exception" />不會對test方法的註解事務衝突。


这篇关于spring 注解 事务,声明事务共存的情况下,先后顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051977

相关文章

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

springboot将lib和jar分离的操作方法

《springboot将lib和jar分离的操作方法》本文介绍了如何通过优化pom.xml配置来减小SpringBoot项目的jar包大小,主要通过使用spring-boot-maven-plugin... 遇到一个问题,就是每次maven package或者maven install后target中的ja

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动