最近遇到一个问题对spring的注解事务有一个全新的认识,网上的资料有得说xml比注解高,有得说xml比注解低低,而我最开始的认为注解比xml要高,首先在系统在xml里面配置了事务方式,但是最近遇到一个业务的时候出现了一个问题,例如测试代码如下
public void updateCustomerByTest() throws BusinessException {
this.getIbatisBaseDAO().update(SQL_NAMESPACE_PREFIX+"updateCnfAccUser");
userHelper.queryTestDetail("100001", "1000010000001");
}
其中xml的配置如下
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="update*" propagation="REQUIRED" rollback-for="Throwable" />
<tx:method name="query*" propagation="NOT_SUPPORTED" />
</tx:attributes>
</tx:advice>
其中updateCustomerByTest方法就是开启一个事务
this.getIbatisBaseDAO().update(SQL_NAMESPACE_PREFIX+"updateCnfAccUser");更新一个条记录
userHelper.queryTestDetail("100001", "1000010000001");去查询这条更新的记录,但是由于查询是NOT_SUPPORTED,所以会把当前事务挂起,已非事务的方式运行,这样查询就会出现锁等情况
这种情况下我在
@Transactional(propagation = Propagation.SUPPORTS)
在userHelper.queryTestDetail方法上,以为注解的优先级会高于xml,但是方法还是会出现锁等的情况,那似乎xml的优先级比注解要高,因为注解没有生效
最后我发现了在优先级上出现了一个理解的问题,首先spring的事务管理都是基于代理去实现,那么如果存在注解事务的话,那么也会出现一个代理切面,那么根据spring的切面顺寻order属性,注解默认配置的order为200,这样相当与注解的代理切面是最后一个执行,因此注解在某些情况下会覆盖xml
本次问题的出现主要原因是xml里面配置了propagation="NOT_SUPPORTED" ,这样相当于在该切面以后的代码都是非事务环境,而且还会把之前的事务挂起(updateCustomerByTest事务挂起),即使注解里面是@Transactional(propagation = Propagation.SUPPORTS),因为最后一个切面已经是非事务环境,查询的时候的锁被挂起事务获得,因此出现锁等
同理我把xml里面的配置改成<tx:method name="query*" propagation="SUPPORTS" />,而注解改成@Transactional(propagation = Propagation.NOT_SUPPORTED),这样同样也出现了锁等,这给人的感觉是注解覆盖了xml,
同理有测试了一下各种场景比如xml文件是<tx:method name="query*" propagation="NOT_SUPPORTED" />
注解是@Transactional(propagation = Propagation.REQUIRED)或者@Transactional(propagation = Propagation.REQUIRE_NEW)都出现了锁等。
其实解决问题的思路很简单,只要把<tx:method name="query*" propagation="SUPPORTS" />,去掉注解的配置就可以了,之前说的优先级只是说注解切面的order是最后一个,但是不能说他一定能覆盖xml,因为这个不是覆盖的关系,而是切面顺序执行的关系,有些时候出现的疑惑也往往是理解偏差引起,回顾一下项目里面用到的注解是REQUIRE_NEW覆盖xml的REQUIRED其实也是理解错误。
相关推荐
Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在多线程、分布式系统中,事务管理显得尤为重要。本节将详细介绍Spring如何通过XML配置和注解方式来实现事务管理。 首先,...
### Spring自定义切面事务问题 #### 背景与挑战 在开发基于Spring框架的应用程序时,我们经常需要利用AOP(面向切面编程)来实现横切关注点(如日志记录、安全控制、事务管理等)的模块化处理。其中,事务管理是...
通过在配置中启用AspectJ自动代理和事务注解支持,Spring会自动识别带有`@Transactional`的方法,并在运行时使用AspectJ织入事务处理代码。这种方式无需额外的代理配置,事务管理更加透明。 5. **使用...
**Spring注解AOP** Spring注解AOP允许我们在不编写XML配置的情况下实现AOP功能。以下是一些关键的注解: 1. `@Aspect`:标记一个类为切面,这个类可以包含多个通知方法。 2. `@Before`:前置通知,方法会在目标...
在JavaEE开发中,Spring框架是广泛使用的轻量级企业级应用框架,它提供了一整套服务,包括数据访问、事务管理、持久化、缓存、远程调用等。其中,AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一...
Bean、通过 FactoryBean 配置 Bean、通过注解配置 Bean、泛型依赖注入、AOP 基础、前置通知、后置通知、返回通知、异常通知、环绕通知、切面的优先级、切点表达式、使用 XML 文件的方式配置 AOP、使用 JdbcTemplate ...
以下是关于Spring事务配置的详细解释: 1. **@Transactional注解**:这是Spring提供的一种声明式事务管理方式。在需要事务管理的类或方法上添加此注解,Spring会自动管理事务的开始、提交、回滚等操作。推荐在具体...
本篇将主要探讨Spring框架的几个核心知识点,包括事务传播属性、注解式事务管理、注解式开发、SSM(Spring+SpringMVC+MyBatis)集成开发流程以及Spring与JUnit测试的整合。 **一、事务传播属性失效问题及解决** ...
3.1 启用Spring的AspectJ注解支持 113 3.1.1 问题 113 3.1.2 解决方案 113 3.1.3 工作原理 113 3.2 用AspectJ注解声明aspect 115 3.2.1 问题 115 3.2.2 解决方案 115 3.2.3 工作原理 116 3.3 访问...
3.1 启用Spring的AspectJ注解支持 113 3.1.1 问题 113 3.1.2 解决方案 113 3.1.3 工作原理 113 3.2 用AspectJ注解声明aspect 115 3.2.1 问题 115 3.2.2 解决方案 115 3.2.3 工作原理 116 3.3 访问...
在Java中,Spring框架提供了对AOP的强大支持,包括使用注解进行自动装配通知的功能。 标题"AOP中的注解自动装配通知"主要涉及两个关键概念:AOP和注解自动装配。首先,让我们详细了解一下这两个概念: **面向切面...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、日志记录等。AOP的核心概念是切面(Aspect)和通知(Advice)...
8. **通知的顺序**:如果有多个通知关联同一个切点,Spring提供了控制通知执行顺序的方式,比如通过@Order注解指定优先级。 9. **事务管理**:Spring AOP的一个常见应用是声明式事务管理,允许开发者在XML配置或...
Spring事务管理是另一个重要的话题,涉及到TransactionDefinition(事务定义)、TransactionStatus(事务状态)和PlatformTransactionManager(平台事务管理器)。TransactionDefinition定义了事务的属性,如隔离...
要在Spring应用中使用AspectJ注解,需要在classpath下包含三个JAR文件:aopalliance.jar、aspectj.weaver.jar和spring-aspects.jar。此外,需要在Spring的Bean配置文件中添加元素以启用AspectJ注解的支持。 5. 声明...
060-spring-tx-事务注解添加实践.mp4 061-spring-tx-只读模式介绍和设置.mp4 062-spring-tx-事务超时时间设置.mp4 063-spring-tx-事务异常指定问题.mp4 064-spring-tx-事务隔离级别设置.mp4 065-spring-tx-事务...
060-spring-tx-事务注解添加实践.mp4 061-spring-tx-只读模式介绍和设置.mp4 062-spring-tx-事务超时时间设置.mp4 063-spring-tx-事务异常指定问题.mp4 064-spring-tx-事务隔离级别设置.mp4 065-spring-tx-事务...
060-spring-tx-事务注解添加实践.mp4 061-spring-tx-只读模式介绍和设置.mp4 062-spring-tx-事务超时时间设置.mp4 063-spring-tx-事务异常指定问题.mp4 064-spring-tx-事务隔离级别设置.mp4 065-spring-tx-事务...
060-spring-tx-事务注解添加实践.mp4 061-spring-tx-只读模式介绍和设置.mp4 062-spring-tx-事务超时时间设置.mp4 063-spring-tx-事务异常指定问题.mp4 064-spring-tx-事务隔离级别设置.mp4 065-spring-tx-事务...