关于@Transactional(propagation = Propagation.REQUIRES_NEW)不生效的问题

Propagation.REQUIRES_NEW的作用是:无论当前上下文是否存在事务都会开启一个新的事务,但是有的时候我们会到配置不起作用的情况;这种情况一般是发生在同一个service调用中;

 //当前在IAlarmService中
 //这里不写默认是Propagation.REQUIRED
    @Override
    public void test() {
        testInsert1();
        testInsert2();
        System.out.println(1/0);//让发生异常
    }

   //这里不写默认是Propagation.REQUIRED
    @Override
    public void testInsert1() {
            Alarm alarm = new Alarm();
            alarm.setDeviceId(UUID.randomUUID().toString());
            alarm.setExpireTime(new Date());
            alarm.setType(1);
            alarm.setTenantId("123");
            alarmMapper.insert(alarm);
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    @Override
    public void testInsert2() {
        Alarm alarm = new Alarm();
        alarm.setDeviceId(UUID.randomUUID().toString());
        alarm.setExpireTime(new Date());
        alarm.setType(2);
        alarm.setTenantId("123");
        alarmMapper.insert(alarm);
    }

按理说test方法发生了异常,testInsert2因为是新开的事务是能够成功插入数据到数据库的,但是在同一个service中无法插入;这是因为在同一个service类中,方法调用通常是通过 this 引用来完成的,而不是通过代理对象。因此,Spring AOP 无法拦截这些方法调用,从而导致事务传播行为不起作用。

解决办法就是在不用的service类中调用;

 //当前在IAlarmService中
 //这里不写默认是Propagation.REQUIRED
    @Override
    public void test() {
        testInsert1();
        alipayService.testInsert2();//IAlipayService中调用
        System.out.println(1/0);//让发生异常
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring简介 Spring 是一个开源框架,是一个分层的 JavaEE 一站式框架。 所谓一站式框架是指 Sp...
    Java机械师阅读 2,586评论 0 1
  • 事务ACID原则原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。一致性:事务...
    炽热_3a57阅读 2,047评论 0 0
  • 目录介绍 1.0.0.1 说下Activity的生命周期?屏幕旋转时生命周期?异常条件会调用什么方法? 1.0.0...
    杨充211阅读 3,741评论 0 2
  • // com.adobe.flash.listen settings.gradle 定义项目包含那些模块app.i...
    zeromemcpy阅读 5,641评论 0 1
  • 一、重点知识 ioc的实现原理1、创建一个工厂类2、用xml解析得到xml文件中的全路径名3、通过反射的方式创建对...
    一花一世界yu阅读 3,060评论 0 2

友情链接更多精彩内容