spring声明事务失效问题

标签: spring 问题 | 发表时间:2014-09-14 21:46 | 作者:征途2010
出处:http://www.iteye.com
问题:
     在项目开发中遇到了一个spring事务失效的问题,检查配置文档,都没有问题,其他的类中的方法都能进行事务管理,而这个类中的方法却不行。

[size=large]分析[/s[color=darkblue]ize][/color]
     查看代码发现三个问题:
原因1、在方法内抓了异常,但是没有往外抛。注:以前这个是手动事务,后来改成了声明事务,而异常却没有往外抛。
当然这里也可以使用手动事务,因为现在没有使用connection的事务,所以使用PlatformTransactionManager 。
        DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
        def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); 
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 
        PlatformTransactionManager txManager = (PlatformTransactionManager )BeanLocator.getInstance().getBean("transactionManager"); 
        TransactionStatus transactionStatus = txManager.getTransaction(def);
        try{
                txManager.commit(transactionStatus); 
        } 
        catch (Exception e) { 
            logger.error("数据入库失败,不删除文件 fileName:" + file.getName(), e); 
            txManager.rollback(transactionStatus); 
        } 

原因2、保存的方法设置为private,这样spring无法进行代理。spring代理主要两种方式,第一种是jdk动态代理,面向接口,无法代理private方法。 第二种是cglib方式,这个是以子类方式实现,由于方法设置为private导致这里无法进行代理而事务失效。
原因3、Action调用了ServiceA的方法A,而方法A没有声明事务(原因是方法A本身比较耗时而又不需要事务)
ServiceA的方法A调用了自己的方法B,而方法B声明了事务,但是方法B的事务声明在这种情况失效了。
如果在方法A上也声明事务,则在Action调用方法A时,事务生效,而方法B则自动参与了这个事务。

因此,从上面的分析可以看出,methodB没有被AopProxy通知到,导致最终结果是:被Spring的AOP增强的类,在同一个类的内部方法调用时,其被调用方法上的增强通知将不起作用。
   
      而这种结果,会造成什么影响呢:
      1:内部调用时,被调用方法的事务声明将不起作用
      2:换句话说,你在某个方法上声明它需要事务的时候,如果这个类还有其他开发者,你将不能保证这个方法真的会在事务环境中
      3:再换句话说,Spring的事务传播策略在内部方法调用时将不起作用。
解决方案:
1、将该类的所有方法都加上事务,即所有方法都会被代理,这样方法B事务才会生效。
2、调用时使用cglib生成的bean去调用方法B,比如说
public void A(){ 
        serviceA.B()
}

而不是直接使用this.B();


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [spring 问题] 推荐:

Spring MVC 3.2.4 ResponseBody 编码问题解决

- - 编程语言 - ITeye博客
首先请确保Spring版本为3.2.4. 问题1:使用@ResponseBody注解,返回对象类型时,如Map,中文字符,在客户端会显示为???. 解决办法:请检查依赖jar包,确保spring-context-support.jar的版本也是3.2.4,则可显示中文;. 问题2:使用@ResponseBody注解,返回String时,中文字符,在客户端会显示为???,并且contextType中会缺失encoding值,即为text/html但是,没有后面的encode.

spring声明事务失效问题

- - 编程语言 - ITeye博客
     在项目开发中遇到了一个spring事务失效的问题,检查配置文档,都没有问题,其他的类中的方法都能进行事务管理,而这个类中的方法却不行. [size=large]分析[/s[color=darkblue]ize][/color].      查看代码发现三个问题:. 原因1、在方法内抓了异常,但是没有往外抛.

Spring 初始化2次的问题

- - 企业架构 - ITeye博客
在Spring的使用中,有时初始化一些公共类,比如数据源、常量配置等,这些方法会执行两次,导致程序执行出现异常. 一个解决方法是利用Spring的事件机制,事件机制需要实现ApplicationListener监听器,只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中初始化应用需要的初始化数据,并做防二次初始化的处理.

spring @Transaction事务不生效问题

- - Java - 编程语言 - ITeye博客
如果你已经排除了以下问题:. 或是数据库本身不支持, 如MySQL的Myisam. 不防看看是不是由多数据源引起的:. 多数据源我们一般这样配置:. 这样, 其中一个数据源就是默认的数据源, 如A. 如果使用@Transaction注解开启事务, 默认使用默认数据源A来进行开启, 提交, 回滚 事务, 这个时候如果@Transaction方法里面是对com.B.dao进行的操作, 那么其实事务也是作用在A数据源上, 就会产生事务不生效的假象.

Spring并发访问的线程安全性问题

- - 寒江孤影
和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题.

spring mvc使用Servlet3异步要注意的几个问题

- - 企业架构 - ITeye博客
1、注意添加 true. 在web.xml中对DispatcherServlet添加true. 2、如果集成了shiro一定要注意在mapping中增加dispatcher项,否则会抛出org.apache.shiro.UnavailableSecurityManagerException异常.

前后端分离,spring boot跨域问题

- - 编程语言 - ITeye博客
1995年,同源政策由 Netscape 公司引入浏览器. 目前,所有浏览器都实行这个政策. 最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源". 所谓"同源"指的是"三个相同". 协议相同/域名相同/端口相同. 一句话:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域.

项目中单元测试容易出现的普遍问题归纳(Junit/Spring/Spring-test/Dubbo/RocketMQ/JAVA)

- - 编程语言 - ITeye博客
   最近公司要求项目在使用maven构建的时候不能跳过test的生命周期,也就是通过mvn test命令需要将整个项目运行起来. 因为之前项目组的成员都是在eclipse中去执行的unit test,在maven对所有模块构建的都是直接-Dmaven.test.skip=true的方式直接跳过UT的.

spring cloud灰度发布快速上下线问题解决 - 简书

- -
因为目前公司架构全部切换到spring cloud 模式,对于服务灰度方面没有dubbo zk的方便了,所以细细研究总结下留作备份. 目前业界有几种流行的发布部署策略,从网上资料可以搜索到,不是这次重点贴出来看看就行了. 蓝绿部署无需停机,并且风险较小. (1) 部署版本1的应用(一开始的状态). 所有外部请求的流量都打到这个版本上.

使用 Spring Security 后性能相差 2-4 倍?是我自己的问题吗?

- - V2EX - 技术
测试环境: 硬件:MacbookPro 8 核 16G 软件:JMeter 1000 线程每秒,SpringBoot2.2.10. 禁用 Spring Security,吞吐量约 20000 左右 启用 Spring Security,吞吐量下降为 5000 左右. Spring Security 里面的逻辑基本都删了,只留了下一些 antMatchers 和 mvcMatchers,大概看了下主要衰减应该就是因为这些 Matchers.