• 阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-26 详解事务的传播-3


    Nested

    如果存在一个事务的话,那么就会开启一个嵌套的事物。这就必须当前有一个事务存在的情况下 ,它才会以一个子事务的框包裹我们的方法 ,那么这就是一种父子事务。是嵌套的。

    如果当前没有事务,就和required执行是一样。
    所以这里我们只会以一个存在的事务方式去讲解。

    子事务和requires_new有区别的。requires_new的话是当前有事务的话会开启一个新的事物,也就是会有两个不同的事务。他们提交的时候也是分别去提交的。

    如果是父子事务,嵌套事务的话,它其实是在一起进行提交的。这一点是要区别开来的。

    演示

    外层用一个父事务,,这里有段异常的代码by.zero

    子方法内使用Nested,嵌套事务。并且把异常代码去掉。

    清空数据库,执行测试.
    数据库内没有数据都回滚了。


    父子嵌套事务,主方法里面发生异常,嵌套事务里面的数据是会被回滚的。这一点要注意。

    如果我们子方法使用的requires_new 它会开启一个新的事物。

    所以当主方法发生了异常的话 ,子方法是不会受影响的。因为requires_new单独开了个事务。


    父-required 子-Nested 这样和两边都使用required是一样的。
    两边都是required是两边共用同一个事务,发生异常都会回滚。
    主方法用requiresd,子方法用nested。只有主方法抛出异常,子方法才会被回滚。也就是主事务发生异常,子事务是要跟着它进行回滚的。

    子事务发生异常的情况

    子方法用Nested。子方法异常代码开启。


    父方法注释异常代码。事务使用required

    数据库清空

    运行测试





    数据库没有任何的内容。

    没有被catch会影响到我们的主方法。


    可以去给他追加try catch

    追加了一个try  catch以后。
    0

    save point。try catch 以后主方法的事物就不受子方法的异常影响了。

    如果下面还有其他的操作 例如 delete、update,都不会收到子事务的影响。Nested事务的解决 方式就是用try catch

    Nested 总结


    如果主事务回滚。子事务可以一起回滚。相反,子事务异常,则父事务可以回滚或者不会滚(就是try catch子事务那种情况。就不回滚。父方法用了catch捕获,就不影响父方法)

    7种事务总的

    结束



     

  • 相关阅读:
    python基础(一)
    python之使用__future__
    python中动态导入模块
    getResource()和getResourceAsStream以及路径问题
    〖转〗request.getparameter()和request.getAttribute()的区别
    IntelliJ IDEA 中module的dependencies是其它module时的注意事项
    IntelliJ IDEA 的Project structure说明
    c#中关于virtual,override和new的理解
    为什么在头文件中只能放声明不能放定义
    sql server 2008 中的架构(schame)理解
  • 原文地址:https://www.cnblogs.com/wangjunwei/p/12051408.html
Copyright © 2020-2023  润新知