`

spring 事务传播特性 测试 发现的问题

阅读更多

测试spring事务传播特性:

  

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void saveLoginInfo(String userName, String dateString, String result) {
        //调用测试方法(本类内的方法)
        this.saveLoginInfoCall("2000040", "2013-09-10 00:00:00.000", "2000040|张美霞test|saveLoginInfo|big1");
        //调用测试方法(注入service的方法)
        this.storeServiceImpl.saveLoginInfoCall("2000040", "2013-09-10 00:00:00.000", "2000040|张美霞test|saveLoginInfo|big1|big2");
        String sql = "INSERT INTO prc_mbl_usr_usg (slsprs_id, lgn_dtm, lgn_sts ) VALUES (" + "'" + userName + "'," + "'" + dateString + "'," + "'" + result + "')";
        logger.info(sql);
        this.baseDaoImpl.insert(sql);
        int m = 0;
        if (m == 0) {
            throw new RuntimeException("出错了!");
        }
        this.baseDaoImpl.insert(sql);
    }

    本类方法saveLoginInfoCall和storeServiceImpl类中的方法一致:

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void saveLoginInfoCall(String userName, String dateString, String result) {
        String sql = "INSERT INTO prc_mbl_usr_usg (slsprs_id, lgn_dtm, lgn_sts ) VALUES (" + "'" + userName + "'," + "'" + dateString + "'," + "'" + result + "')";
        logger.info(sql);
        this.baseDaoImpl.insert(sql);

        int m = 0;

//        if (m == 0) {
//            throw new RuntimeException("出错了!");
//        }
        this.baseDaoImpl.insert(sql);
    }

   测试代码:

 

  

    @Test
    public void testTransaction() {
        System.out.println(AopUtils.isAopProxy(loginServiceImpl));
        System.out.println(loginServiceImpl.getClass().getName());
        loginServiceImpl.saveLoginInfo("2000040", "2013-09-10 00:00:00.000", "2000040|张美霞test|saveLoginInfo");
    }

   声明一下:saveLoginInfo()方法所在类为loginServiceImpl

 

   经测试发现,当saveLoginInfo()方法调用本类内的saveLoginInfoCall()方法后,然后抛出异常,本类内的方法saveLoginInfoCall()并没有插入数据库,而调用storeServiceImpl类的saveLoginInfoCall()方法则插入数据库;按照REQUIRES_NEW事物的传播特性来说,两个方法的出入都应该能成功(都是新起一个事物,在自己的事务内提交,在异常抛出之前就已经提交到数据库)。可是调用本类内的方法就是没有成功!

 

 

然后继续测试,把本类内和storeServiceImpl类内的方法saveLoginInfoCall()的事务注解全部改为NEVER,然后测试发现:在执行本类内的方法saveLoginInfoCall()时没有报错,而是在执行storeServiceImpl类的saveLoginInfoCall()方法时报错,安装NEVER的传播特性来说,在执行本类内的saveLoginInfoCall()方法时就会报错(NEVER事务传播特性为不支持事务,存在事务则抛出异常)

 

根据上面的可以总结为,当一个方法使用spring事务时,调用同一个类的另个使用spring事务的方法时候,被调用方法的事务不生效,可是为什么呢?现在还没找到下手寻找答案的线索!

分享到:
评论

相关推荐

    spring事物传播测试表

    事务传播行为(Transaction Propagation)是Spring事务管理中一个关键的概念,用于定义在一个事务方法被调用时,如何与当前运行的事务进行交互。本文将深入探讨“Spring事物传播测试表”所涉及的知识点。 首先,...

    Spring源码-中级(四)-Spring事务: 事务的传播特性测试.xlsx

    事务的传播特性测试.xlsx

    spring 事务传播与隔离级别DEMO

    本DEMO主要探讨的是Spring事务的传播行为和隔离级别,这些概念对于理解和优化数据库操作至关重要。让我们深入理解这些概念及其实际应用。 首先,我们来谈谈事务的传播行为。在Spring中,当一个方法被另一个具有事务...

    Spring事务管理失效原因汇总

    在开发过程中,进行充分的测试,尤其是集成测试和压力测试,可以帮助开发者及时发现问题并加以修复。 总结来说,Spring事务管理失效的原因是多方面的,涵盖从代理模式原理到AOP的实现细节,再到异常处理机制,以及...

    Spring事务小demo

    首先,Spring事务管理是Spring框架的核心特性之一,它允许我们以声明式或编程式的方式管理事务。声明式事务管理通过配置元数据(如XML或注解)来定义事务边界,而编程式事务管理则是在代码中显式调用...

    Spring事务管理A方法内部调用B方法的回滚问题测试代码

    在Spring框架中,事务管理是核心特性之一,用于确保数据操作的一致性和完整性。当一个方法(A方法)内部调用另一个方法(B方法)时,可能会遇到事务控制...这个示例代码对于理解和调试Spring事务管理的问题非常有帮助。

    spring声明事务的配置

    Spring声明式事务管理是Spring框架的核心特性之一,它允许开发者在不侵入业务代码的情况下,对应用程序的事务进行管理。这种方式极大地提高了代码的可维护性和灵活性。以下是对Spring声明式事务配置的详细说明: 1....

    Spring事务类型祥解

    - `propagation`: 事务传播行为,如`REQUIRED`(默认)表示如果当前没有事务,则新建一个;`SUPPORTS`表示如果已有事务就加入,没有则不开启新事务等。 - `isolation`: 事务隔离级别,如`DEFAULT`(默认)遵循数据库...

    Spring aop、jdbc和事务tx练习

    在IT领域,Spring框架是Java开发中的核心工具之一,它为构建高质量的、可维护的、松耦合的应用程序...在实践中,你可能会遇到的问题包括事务传播行为、异常回滚规则、事务隔离级别等,这些都是进一步学习和研究的方向。

    spring事务配置的五种方式

    ### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要的一部分,特别是在涉及多个数据库操作时。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务处理方式。...

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

    1.业务代码列举7种事务传播机制的情况,每个测试方法都附带日志分析记录、使用场景和实际场景,小白也能看得懂!!! 2.在测试类Test包下,使用juniter进行测试,方便快捷清晰。 ①用到了@BeforeEach,正式执行测试...

    spring声明式事务处理demo

    3. **事务传播行为**:Spring提供了多种事务传播行为,例如PROPAGATION_REQUIRED(默认值,如果当前存在事务,则加入该事务;如果不存在,则创建一个新的事务)、PROPAGATION_SUPPORTS(如果当前存在事务,则加入该...

    spring事务测试

    本文将主要围绕Spring事务测试展开,讲解如何在Spring中进行事务管理和测试。 在Spring框架中,事务管理是通过声明式或编程式的方式来实现的。声明式事务管理通过配置XML或者使用注解来定义事务边界,使得开发者...

    spring-transations-jpa:使用MySql进行有关Spring事务传播的测试用例-帮助了解事务边界

    本项目“spring-transactions-jpa”旨在通过MySql数据库进行一系列测试,以深入理解Spring事务传播行为,这对于开发复杂的分布式系统至关重要。在本文中,我们将详细探讨Spring事务的传播行为以及如何在JPA(Java ...

    解决osgi spring 事务配置问题

    在OSGi(Open Service Gateway Initiative)环境中配置Spring事务可能会遇到一些挑战,因为OSGi的模块化特性使得类加载和依赖管理变得复杂。本篇文章将详细探讨如何在OSGi环境中正确配置Spring事务管理。 首先,...

    Spring框架的事务管理应用分析.doc

    - **统一的事务策略**:Spring事务管理支持JDBC、Hibernate、JPA等多种数据访问技术,提供了一致的事务处理方式。 - **灵活性**:可以选择编程式或声明式事务管理,根据项目需求调整事务控制粒度。 - **异常传播**:...

    spring与mybatis整合实现事务配置

    在Java Web开发中,Spring和MyBatis是两个非常重要的框架。Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面...同时,良好的事务管理能够确保数据的一致性和完整性,避免因并发问题引发的数据不一致。

    Spring相关测试3

    通过这些测试,你可以确保Spring事务管理在实际应用中的稳定性和可靠性。 总的来说,理解并熟练运用Spring的事务管理是成为合格的Java开发者所必需的技能之一。它不仅有助于保证数据一致性,还能提高代码的可读性...

    使用Spring的声明式事务----Annotation注解方式

    Spring定义了7种事务传播行为,例如`Propagation.REQUIRED`(如果当前存在事务,则加入;若无,则新建)、`Propagation.SUPPORTS`(如果存在事务则支持,否则不开启新事务)等。选择合适的传播行为可以确保事务处理...

    spring3,hibernate4 配置声明式事务管理(annotation方式)

    在Java开发中,Spring框架和Hibernate ORM工具是两个非常重要的组件。Spring提供了强大的依赖注入(DI...在实际开发中,可以根据项目需求调整事务的传播属性、隔离级别、超时限制等高级特性,以实现更精细的事务管理。

Global site tag (gtag.js) - Google Analytics