栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot中事务@Transational的一个坑

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot中事务@Transational的一个坑

如果一个方法调用了同一个类中的其他方法那么其他方法在@Transational注解中的propagation属性中无论设置什么样的值都不会生效

代码举例:

    @Transactional(propagation = Propagation.REQUIRED)
    public String a(){
        b();
        c();
        return "aaa";
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public String b(){
        
        return "bbb";
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public String c(){
        return "ccc";
    }

在此代码中a方法调用b和c方法但是b和c方法的传播行为不会生效,还是与a相同。

原因:SpringBoot中事务是使用代理对象来控制的,如果是同一个对象内方法互调,默认失败,原因是绕过了代理对象。(因为this本身就是当前对象,是没有经过代理的)

解决:使用代理对象来调用事务方法
 1)、引入aop-starter;spring-boot-starter-aop;引入了aspect
 2)、@EnableAspectJAutoProxy;开启aspectj动态代理功能。以后所有的动态代理都是aspectj创建的(即使没有接口也可以创建动态代理)。@EnableAspectJAutoProxy(exposeProxy = true)对外暴露代理对象
 3)、本类互调用代理对象

举例代码:

    @Transactional(propagation = Propagation.REQUIRED)
    public String a(){
        OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();
        orderService.b();
        orderService.c();
        return "aaa";
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public String b(){

        return "bbb";
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public String c(){
        return "ccc";
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/872635.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号