• Spring:Spring嵌套事务方式


    Spring遇到嵌套事务时,怎么实现

    实验时却遇到一个奇怪的问题:


    1、当ServiceA.a()方法调用ServiceB.b()方法时,内层事务提交和回滚,都不受外层事务提交或回滚的影响。


    2、当ServiceA.a()方法调用ServiceA.c()方法时,内层事务不能正确地提交或回滚。

    如下:

    xxxServiceA类中,有如下两个方法。

    @Transactional 
    method_One() {
        method_Two();
    }
    
    
    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    method_Two(){
        //do something
    }

    没有找到类似creating new transaction的输出,同一个Service类中,spring并不重新创建新事务,如果是两不同的Service,就会创建新事务了。

    xxxServiceA类:

    @Transactional 
    method_One() {
        method_Two();
    }

    xxxServiceB类:

    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    method_Two(){
        //do something
    }

    Propagation.REQUIRES_NEW生效创建了一个新事务

     

    让事务起作用,遇到错误进行回滚,应该注意的事项

    第一种情况:同一个类中 一个方法无嵌套方法

    如果方法名上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException()。否则事务不起作用。


    第二种情况:同一个类中 方法A嵌套方法B
    方法A有@Transactional,方法内都没有try catch,事务起作用。
    方法A有@Transactional和try catch,并且catch中用throw new RuntimeException(),事务起作用。


    第三种情况:不同类中方法C嵌套方法B
    方法B上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException()。否则方法B的事务不起作用。
    方法C上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException(),此时方法B怎么写都行。否则方法C的事务不起作用。

    文章转载至:https://blog.csdn.net/m0_37701381/article/details/85066711

  • 相关阅读:
    element的导航栏修改其选中时颜色的问题
    如何设置element的时间选择器,当日后面的时间无法选中
    Mybatis3配置详解
    mybatis-generator mybatis逆向生成
    Oracle中Thin和OCI的区别
    Jetbrains系列之Phpstorm使用sftp远程开发线上项目
    Thinkphp6.0文档部分摘抄
    linux + 宝塔 + thinkphp5.0 搭建后端api各种问题集合
    Oracle用户,角色和权限
    CentOS7.6 安装 Oracle19c
  • 原文地址:https://www.cnblogs.com/nhdlb/p/12120629.html
Copyright © 2020-2023  润新知