Spring事务失效的一种原因关于this调用的问题

 更新时间:2021年10月31日 09:07:32   作者:weixin_33976072  
这篇文章主要介绍了Spring事务失效的一种原因关于this调用的问题,本文给大家分享问题原因及解决办法,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
  • PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启事务;
  • PROPAGATION_REQUIRES_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起;

问题:

Spring中一个没有事务的方法A调用一个默认事务(PROPAGATION_REQUIRED)的方法B时,如果使用this调用方法B,方法B抛出RuntimeException,此时方法B事务未生效,不会回滚。

@Service
public class EmployeeService {
 
    @Autowired
    private EmployeeDao employeeDao;
 
    public void save(){
        try {        
            this.saveEmployee();  //此处this调用不会开启事务,数据会被保存
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    
    @Transactional(propagation = Propagation.PROPAGATION_REQUIRED)
    //此处无论是PROPAGATION_REQUIRED还是PROPAGATION_REQUIRES_NEW,事务均不生效
    public void saveEmployee(){
        Employee employee = new Employee();
        employee.setName("zhangsan");
        employee.setAge("26";
        employeeDao.save(employee);
        throw new RuntimeException();
    }
}

问题原因:

JDK的动态代理。只有被动态代理直接调用时才会产生事务。在SpringIoC容器中返回的调用的对象是代理对象而不是真实的对象。而这里的this是EmployeeService真实对象而不是代理对象。

解决办法:

方法1、在方法A上开启事务,方法B不用事务或默认事务,并在方法A的catch中throw new RuntimeException();(在没指定rollbackFor时,默认回滚的异常为RuntimeException),这样使用的就是方法A的事务。(一定要throw new RuntimeException();否则异常被捕捉处理,同样不会回滚。)如下:

@Transactional() //开启事务
public void save(){
    try {        
        this.saveEmployee();  //这里this调用会使事务失效,数据会被保存
    }catch (Exception e){
        e.printStackTrace();
        throw new RuntimeException();
    }
}

方法2、方法A上可以不开启事务,方法B上开启事务,并在方法A中将this调用改成动态代理调用(AopContext.currentProxy()),如下:

public void save(){
    try {        
        EmployeeService proxy =(EmployeeService) AopContext.currentProxy();
        proxy.saveEmployee();
    }catch (Exception e){
        e.printStackTrace();
    }
}

到此这篇关于spring事务调用失效问题的文章就介绍到这了,更多相关spring事务调用失效问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现微信点餐申请微信退款

    java实现微信点餐申请微信退款

    这篇文章主要为大家详细介绍了java实现微信点餐申请微信退款,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • JavaWeb利用邮箱帮用户找回密码

    JavaWeb利用邮箱帮用户找回密码

    这篇文章主要为大家详细介绍了JavaWeb利用邮箱帮用户找回密码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • RabbitMQ简单队列实例及原理解析

    RabbitMQ简单队列实例及原理解析

    这篇文章主要介绍了RabbitMQ简单队列实例及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 注解、原生Spring、SchemaBased三种方式实现AOP代码案例

    注解、原生Spring、SchemaBased三种方式实现AOP代码案例

    这篇文章主要介绍了注解、原生Spring、SchemaBased三种方式实现AOP的方法介绍,文中有详细的代码示例,对我们的学习有一定的帮助,需要的朋友可以参考下
    2023-06-06
  • java md5工具类分享

    java md5工具类分享

    这篇文章主要介绍了java的md5工具类,需要的朋友可以参考下
    2014-02-02
  • Java实现批量合并Excel工作表

    Java实现批量合并Excel工作表

    这篇文章主要为大家详细介绍了如何使用Java快速实现批量Excel工作表的合并,文中的示例代码代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • SpringBoot使用Nacos配置中心的实现

    SpringBoot使用Nacos配置中心的实现

    这篇文章主要介绍了SpringBoot使用Nacos配置中心的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java之单例模式实现方案详解

    Java之单例模式实现方案详解

    这篇文章主要介绍了Java之单例模式实现方案详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java ByteBuffer网络编程用法实例解析

    Java ByteBuffer网络编程用法实例解析

    这篇文章主要介绍了Java ByteBuffer网络编程用法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • spring redis 如何实现模糊查找key

    spring redis 如何实现模糊查找key

    这篇文章主要介绍了spring redis 如何实现模糊查找key的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论