`
征途2010
  • 浏览: 247520 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring声明事务失效问题

阅读更多
问题:
     在项目开发中遇到了一个spring事务失效的问题,检查配置文档,都没有问题,其他的类中的方法都能进行事务管理,而这个类中的方法却不行。

分析
     查看代码发现三个问题:
原因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();
分享到:
评论

相关推荐

    Spring事务管理失效原因汇总

    描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现问题,暴露了开发者对Spring事务机制不足够了解的问题。标签“Spring 事务 失效”直接概括了本文的知识点范围,即Spring...

    Spring自定义切面事务问题

    给定的示例代码展示了如何通过配置`order`属性来解决事务失效的问题: ```xml <!-- 声明使用注解式事务 --> ``` 这里的`order`属性被设置为200,这意味着事务管理器的优先级相对较高。接下来,自定义切面的...

    Spring的事务10种常见失效场景总结.zip

    1. **未开启事务**:如果在需要事务控制的方法中忘记添加`@Transactional`注解,Spring将不会自动进行事务管理,导致事务失效。记得在服务层方法上正确使用该注解,确保事务开始和结束。 2. **切面配置错误**:在...

    springtransaction 事务管理

    Spring事务管理主要包括编程式事务管理和声明式事务管理两种方式,使得开发者能够在不深入理解底层事务实现的情况下,轻松地在应用程序中管理事务。 1. **编程式事务管理**: 编程式事务管理是通过调用`...

    解决osgi spring 事务配置问题

    但在OSGi中,由于类加载器的隔离,Spring的代理机制可能会失效,导致事务无法正常工作。 为了解决这个问题,我们需要理解OSGi的类加载机制。每个bundle(类似于Java的jar包)都有自己的类加载器,这意味着类的实例...

    spring事务总结.docx

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

    Spring事务不生效.pdf

    如示例代码所示,如果一个@Transactional注解的方法被声明为private,Spring在检查方法访问权限时会判定其不支持事务,导致事务失效。 ```java @Service public class UserService { @Transactional private void...

    springAop事务配置

    在Spring框架中,AOP(面向切面编程)被广泛用于实现事务管理,因为它允许我们以声明式的方式处理事务,从而让业务代码更加简洁、易维护。本篇将详细讲解Spring AOP如何进行事务配置,包括注解和非注解两种方式。 1...

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

    Spring 框架提供了两种事务管理机制:编程式事务管理和声明式事务管理。编程式事务管理需要手动编写事务管理代码,而声明式事务管理使用注解或 XML 配置来管理事务。 Spring+SpringMVC 配置事务管理无效原因 在...

    什么情况会导致@Transactional事务失效?

    在Java编程中,`@Transactional`注解是Spring框架提供的一种事务管理机制,它使得开发者能够在方法级别方便地声明事务边界。然而,在某些特定情况下,`@Transactional`可能会失效,导致事务无法正常工作。以下是一些...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 ...

    Spring之Spring2.5集成Hibernate3.6

    4. 在Spring配置文件中声明事务管理器和数据源。 5. 使用@Autowired注解将DAO注入到Service层。 6. 测试和调整配置,确保事务和缓存工作正常。 在压缩包文件“test_9”中,如果没有进一步的信息,我们无法确定它...

    spring05-6

    Spring框架提供了一种强大的事务管理机制,允许开发人员声明式地控制事务边界。通过使用`@Transactional`注解,可以在方法级别指定事务的开始、提交和回滚条件。例如,当一个方法带有`@Transactional`注解时,Spring...

    Spring认证考试流程

    4. 事务(8%):涵盖了事务管理的策略,如编程式和声明式事务管理。 5. Security(6%):涉及Spring Security的基本概念,如授权、认证和过滤器链。 6. MVC(8%):考察Spring MVC框架的理解,包括控制器、视图解析...

    Spring In Action 随书源码

    3. **AOP**:Spring的AOP模块支持声明式事务管理、日志记录、性能监控等跨切面关注点,使得这些功能可以独立于业务逻辑进行实现和管理。 4. **数据访问**:Spring提供了JDBC抽象层,简化了数据库操作;还支持ORM...

    这一次搞懂Spring事务注解的解析方式

    - 没有正确处理异常:未检查异常和受检查异常的处理不当可能导致事务失效。 通过理解这些核心概念和机制,我们可以更深入地掌握Spring事务注解的工作原理,避免在实际开发中遇到不必要的问题。

    spring

    由于博客已失效,我们无法获取具体的信息,但可以推测它可能涉及Spring的一些关键特性或常见问题的解决方案。 标签包括"源码"和"工具",这提示我们该压缩包内容可能包含了Spring框架的部分源代码或者与Spring相关的...

Global site tag (gtag.js) - Google Analytics