`
海绵88
  • 浏览: 29658 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring事务无法生效问题

    博客分类:
  • ssh
 
阅读更多
问题描述:
第一种方式:

使用注释@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事务不生效.pdf

    通过理解以上这些常见问题,开发者可以更好地预防和解决Spring事务不生效的问题,确保应用的事务处理正常运行,保持数据的一致性和完整性。在实际开发中,细心检查和配置事务管理,避免潜在的陷阱,是保证系统稳定性...

    Spring事务管理失效原因汇总

    标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...

    Spring基于XML方式配置事务

    为了让事务通知生效,我们需要创建一个AOP代理。可以使用`&lt;aop:config&gt;`和`&lt;aop:advisor&gt;`标签来实现。`&lt;aop:advisor&gt;`中的`pointcut-ref`属性引用了匹配需要事务管理的方法的切点表达式。 5. **定义切点表达式**...

    spring事务总结.docx

    然而,在实际开发过程中,经常会遇到一些关于Spring事务的问题,如事务失效、事务回滚、大事务问题以及编程式事务等。本文将深入探讨这些问题,并给出相应的解决方案。 #### 一、事务不生效的原因及解决办法 1. **...

    请教:spring事务不起作用

    然而,在实际开发中,有时我们可能会遇到"Spring事务不起作用"的问题。这个问题可能是由多种原因引起的,包括但不限于配置错误、事务注解使用不当、事务传播行为理解有误等。下面我们将深入探讨这些可能的原因,并...

    Spring中的AOP不生效

    在Java开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程思想和技术手段,主要用于处理横切关注点问题,如日志记录、性能统计、安全控制、事务处理等。在Spring框架中,AOP可以通过...

    Spring事务相关问题解决方案

    知识点3: Spring事务的生效问题 在Spring框架中,事务的生效是通过cglib动态代理来实现的。如果事务方法与调用方法在同一个类中,事务将不生效。解决方法是将事务方法移到单独的类中。 知识点4: 事务测试的重要性 ...

    Spring三种事务测试实现.zip

    Spring项目,数据库用mysql,整合Mybatis,需要自己创建数据库testinnodb,以及两张表Account,int id, int account,表Log,int id ,vchar log。三种事务,手动实现事务,利用AOP实现,以及声明式事务,lib中有所有...

    spring事务-项目案例-PPT解读.zip

    spring事务_案例_PPT 一、事务传播机制的demo案例,内容包括: 1.业务代码列举7种事务传播机制的情况,...7.spring事务15种不生效的场景 8.事务的基本属性和常用的属性字段 三、压缩包有数据库和数据表,直接运行即可。

    S详细讲解SH中Spring事务流程.doc

    在本文中,我们将深入探讨SSH框架中的Spring事务管理流程。SSH(Struts、Hibernate和Spring)是Java Web开发中的经典组合,其中Spring提供了强大的事务管理功能,确保了数据操作的一致性和完整性。下面,我们将详细...

    25个经典的Spring面试问题包含答案

    这篇文档“25个经典的Spring面试问题包含答案”旨在帮助求职者和开发者更好地理解Spring的核心概念和实际应用。以下是对这些问题的详细解读: 1. **什么是Spring框架?** Spring是一个开源的Java平台,它为构建...

    Spring事务传播行为问题解决

    Spring事务传播行为问题解决 Spring事务传播行为问题解决是指在Spring框架中,事务传播行为的配置和使用问题。事务传播行为是指在多个事务方法之间的调用关系,如何去管理和控制事务的传播和回滚。 一、 Spring...

    跟我学Spring3(9.4)Spring的事务之声明式事

    对于非Spring管理的bean或者静态方法,声明式事务管理无法生效。 在实际开发中,声明式事务管理具有很多优势,例如代码简洁、事务管理与业务代码分离,使得事务策略易于调整和测试。但同时,由于事务的控制权交给了...

    详细整理Spring事务失效的具体场景及解决方案.docx

    "Spring事务失效的具体场景及解决方案详细整理" 在实际项目开发中,为了保证业务数据的一致性,大家一般都会采用事务机制。但是,很多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手。下面我们将...

    spring3 struts2 Mybatis3 组件注解 事务注解 实例

    Spring的`&lt;tx:annotation-driven&gt;`标签启用注解驱动的事务管理,使`@Transactional`生效。Struts2的配置文件需要指定Action类及其结果映射,而Mybatis3的配置则包括数据源、SqlSessionFactory和Mapper扫描。 在业务...

    springboot实现多数据源而且加上事务不会使aop切换数据源失效

    本示例主要讲解如何使用Spring Boot结合MyBatis实现多数据源切换,并确保AOP事务管理仍然有效。 首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两...

    Spring+SpringMVC配置事务管理无效原因及解决办法详解

    然而,在使用 Spring 和 SpringMVC 配置事务管理时,可能会遇到事务管理无效的问题。本文将详细介绍 Spring+SpringMVC 配置事务管理无效原因及解决办法。 事务管理在 Spring 中的重要性 在企业级应用程序中,事务...

    spring声明式事务.zip

    此外,对于非Spring管理的bean,声明式事务可能无法生效。 7. **最佳实践** 在实际项目中,推荐结合使用基于XML和注解的声明式事务管理。对于事务管理的核心逻辑,如事务传播行为和隔离级别,可以在XML配置中统一...

    SpringCloud Alibaba使用(四) - seata分布式事务.zip

    Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务 一个典型的分布式事务过程:分布式事务处理过程的-ID+三组件模型 Transaction ID XID :全局唯一的事务ID ...

    spring1.2申明式事务.txt

    为了使声明式事务生效,还需要配置一个`BeanNameAutoProxyCreator`,它会根据指定的bean名称为相应的bean创建事务代理: ```xml &lt;bean id="beanautoproxy" class="org.springframework.aop.framework.autoproxy....

Global site tag (gtag.js) - Google Analytics