`
海绵88
  • 浏览: 29067 次
  • 性别: 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三种事务测试实现.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.事务的基本属性和常用的属性字段 三、压缩包有数据库和数据表,直接运行即可。

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

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

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

    用springboot 集成mybatis多数据源,用aop实现的动态切换,支持事务,不会使aop动态切换失效。注意:此代码不涉及分布式事务,如果需要分布式事务 需要采取其他方案。

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

    主要介绍了Spring+SpringMVC配置事务管理无效原因及解决办法详解,具有一定借鉴价值,需要的朋友可以参考下

    声明式事务失效的方法

    使用spring+springMVC 组合开发,声明式事务失效

    SpringBoot内部调用事务不起作用问题的解决方案

    主要介绍了SpringBoot事务不起作用问题的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java中高级面试题 java面试

    Java数据结构 拦截器与过滤器 MD5和Base64的区别 垃圾回收机制(GC) spring介绍 springBean的生命周期 悲观锁和乐观锁 mysql事务隔离级别 ...spring事务不生效的场景 spring事务隔离级别 MySQL事务隔离级别

    springboot参考指南

    设置生效的Spring profiles vi. 63.6. 根据环境改变配置 vii. 63.7. 发现外部属性的内置选项 iii. 64. 内嵌的servlet容器 i. 64.1. 为应用添加Servlet,Filter或ServletContextListener ii. 64.2. 改变HTTP端口 iii...

    企业后台管理基础框架 hsweb.zip

    分布式事务,多数据源事务全靠他.Cache:spring-cache. 统一接口,注解使用,simple,redis... 自动切换.Scheduler:quartz. 开源稳定,支持集群.自家:hsweb-commons :通用工具类hsweb-easy-orm :为动态表单设计的orm...

    ShardingSphere:SpringBoot2+MybatisPlus3+UI不分库只分表

    Sharding-JDBC可以通过Java,YAML,Spring命名空间和Spring Boot Starter四种方式配置,开发者可根据场景选择适合的配置方式。 课程特色?本章节以尽量短的时间,为使用者提供最简单的ShardingSp

    asp.net知识库

    对页面SCROLLING的CSS不能生效原因 .Net 中IE使用WinForm控件的使用心得。 动态加载用户控件的组件!(终结MasterPages技术) 在ASP.NET 1.1下实现模板化站点的新思路 在ASP.Net中两种利用CSS实现多界面的方法 用于...

Global site tag (gtag.js) - Google Analytics