问题描述:
第一种方式:
使用注释@Transactional 方式,网上查配置找不到问题,但就是不生效,于是换成第二种配置aop的方式
<context:annotation-config />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
第二种方式
这种方式其他项目用过没有问题,但是我这……
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="query*" propagation="REQUIRED" read-only="true"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="batchSave*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="exe*" propagation="REQUIRED"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="trManagers" expression="execution(* com.test.core.task.impl.*.*(..)) "/>
<aop:advisor id="txAdviceAop" advice-ref="advice" pointcut-ref="trManagers"/>
</aop:config>
两张方式试了,尤其第二种方式,其他项目都没问题,于是进入了瓶颈。
问题的解决:
这两种方式实质都是aop代理(第一种,只是通过注释标签翻译后的aop),而spring的代理方式有两种:1.java动态代理(默认,只能代理接口方式)。2.CGLIB方式代理。
既然没有改过代理方式,那肯定就是java动态代理,而动态代理需要的是接口。
。
看代码:
AsyncInvokeHandlerImpl .java代码如下
public class AsyncInvokeHandlerImpl implements InvokeHandler {
//此为InvokeHandler 接口的方法
public String execute(HttpServletRequest request) throws Exception {
//......
}
//需要事务的方法
public void exe(HttpServletRequest request){
}
//需要事务的方法
public boolean insertTask(Task task){
}
InvokeHandler .java(接口)代码:
public interface InvokeHandler {
<T> String execute(HttpServletRequest request) throws Exception;
}
很明显,AsyncInvokeHandlerImpl .java中需要事务的对应都没有接口方法,所以事务无法代理这两个方法,故事务失效。
重新把需要实现的方法实现对应的接口即可。
分享到:
相关推荐
通过理解以上这些常见问题,开发者可以更好地预防和解决Spring事务不生效的问题,确保应用的事务处理正常运行,保持数据的一致性和完整性。在实际开发中,细心检查和配置事务管理,避免潜在的陷阱,是保证系统稳定性...
标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...
为了让事务通知生效,我们需要创建一个AOP代理。可以使用`<aop:config>`和`<aop:advisor>`标签来实现。`<aop:advisor>`中的`pointcut-ref`属性引用了匹配需要事务管理的方法的切点表达式。 5. **定义切点表达式**...
然而,在实际开发过程中,经常会遇到一些关于Spring事务的问题,如事务失效、事务回滚、大事务问题以及编程式事务等。本文将深入探讨这些问题,并给出相应的解决方案。 #### 一、事务不生效的原因及解决办法 1. **...
然而,在实际开发中,有时我们可能会遇到"Spring事务不起作用"的问题。这个问题可能是由多种原因引起的,包括但不限于配置错误、事务注解使用不当、事务传播行为理解有误等。下面我们将深入探讨这些可能的原因,并...
在Java开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程思想和技术手段,主要用于处理横切关注点问题,如日志记录、性能统计、安全控制、事务处理等。在Spring框架中,AOP可以通过...
知识点3: Spring事务的生效问题 在Spring框架中,事务的生效是通过cglib动态代理来实现的。如果事务方法与调用方法在同一个类中,事务将不生效。解决方法是将事务方法移到单独的类中。 知识点4: 事务测试的重要性 ...
Spring项目,数据库用mysql,整合Mybatis,需要自己创建数据库testinnodb,以及两张表Account,int id, int account,表Log,int id ,vchar log。三种事务,手动实现事务,利用AOP实现,以及声明式事务,lib中有所有...
spring事务_案例_PPT 一、事务传播机制的demo案例,内容包括: 1.业务代码列举7种事务传播机制的情况,...7.spring事务15种不生效的场景 8.事务的基本属性和常用的属性字段 三、压缩包有数据库和数据表,直接运行即可。
在本文中,我们将深入探讨SSH框架中的Spring事务管理流程。SSH(Struts、Hibernate和Spring)是Java Web开发中的经典组合,其中Spring提供了强大的事务管理功能,确保了数据操作的一致性和完整性。下面,我们将详细...
这篇文档“25个经典的Spring面试问题包含答案”旨在帮助求职者和开发者更好地理解Spring的核心概念和实际应用。以下是对这些问题的详细解读: 1. **什么是Spring框架?** Spring是一个开源的Java平台,它为构建...
Spring事务传播行为问题解决 Spring事务传播行为问题解决是指在Spring框架中,事务传播行为的配置和使用问题。事务传播行为是指在多个事务方法之间的调用关系,如何去管理和控制事务的传播和回滚。 一、 Spring...
对于非Spring管理的bean或者静态方法,声明式事务管理无法生效。 在实际开发中,声明式事务管理具有很多优势,例如代码简洁、事务管理与业务代码分离,使得事务策略易于调整和测试。但同时,由于事务的控制权交给了...
"Spring事务失效的具体场景及解决方案详细整理" 在实际项目开发中,为了保证业务数据的一致性,大家一般都会采用事务机制。但是,很多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手。下面我们将...
Spring的`<tx:annotation-driven>`标签启用注解驱动的事务管理,使`@Transactional`生效。Struts2的配置文件需要指定Action类及其结果映射,而Mybatis3的配置则包括数据源、SqlSessionFactory和Mapper扫描。 在业务...
本示例主要讲解如何使用Spring Boot结合MyBatis实现多数据源切换,并确保AOP事务管理仍然有效。 首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两...
然而,在使用 Spring 和 SpringMVC 配置事务管理时,可能会遇到事务管理无效的问题。本文将详细介绍 Spring+SpringMVC 配置事务管理无效原因及解决办法。 事务管理在 Spring 中的重要性 在企业级应用程序中,事务...
此外,对于非Spring管理的bean,声明式事务可能无法生效。 7. **最佳实践** 在实际项目中,推荐结合使用基于XML和注解的声明式事务管理。对于事务管理的核心逻辑,如事务传播行为和隔离级别,可以在XML配置中统一...
Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务 一个典型的分布式事务过程:分布式事务处理过程的-ID+三组件模型 Transaction ID XID :全局唯一的事务ID ...
为了使声明式事务生效,还需要配置一个`BeanNameAutoProxyCreator`,它会根据指定的bean名称为相应的bean创建事务代理: ```xml <bean id="beanautoproxy" class="org.springframework.aop.framework.autoproxy....