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

本文通过具体案例探讨了Spring框架中事务传播特性的行为。特别是针对REQUIRED和REQUIRES_NEW传播级别下,同一类内部方法调用时的不同表现,并对NEVER传播级别的行为进行了对比测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试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事务的方法时候,被调用方法的事务不生效,可是为什么呢?现在还没找到下手寻找答案的线索!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值