zoukankan      html  css  js  c++  java
  • REQUIRED、REQUIRES_NEW、NESTED 3个 spring 事务传播级别使用场景

    当前方法,假定方法名是save()

    1、事务传播级别是REQUIRED,当save()被调用时(假定被另一类中commit()调用),如果save()中的代码抛出异常,即便被捕获,commit()中的其他代码都会roll back

    2、是REQUIRES_NEW,如果save()中的代码抛出异常,并且被捕获,commit()中的其他代码不会roll back;如果commit()中的其他代码抛出异常,而且没有捕获,不会导致save()回滚

    3、是NESTED,如果save()中的代码抛出异常,并且被捕获,commit()中的其他代码不会roll back;如果commit()中的其他代码抛出异常,而且没有捕获,会导致save()回滚

    借用博客中的总结:

        PROPAGATION_REQUIRES_NEW 启动一个新的, 不依赖于环境的 "内部" 事务. 这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行. 
        另一方面, PROPAGATION_NESTED 开始一个 "嵌套的" 事务,  它是已经存在事务的一个真正的子事务. 嵌套事务开始执行时,  它将取得一个 savepoint. 如果这个嵌套事务失败, 我们将回滚到此 savepoint. 潜套事务是外部事务的一部分, 只有外部事务结束后它才会被提交. 
        由此可见, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大区别在于, PROPAGATION_REQUIRES_NEW 完全是一个新的事务, 而 PROPAGATION_NESTED 则是外部事务的子事务, 如果外部事务 commit, 嵌套事务也会被 commit, 这个规则同样适用于 roll back. 

    注意:被同一类中方法调用,传播级别无效

  • 相关阅读:
    【ACM-ICPC 2018 南京赛区网络预赛 L】Magical Girl Haze
    【Manthan, Codefest 18 (rated, Div. 1 + Div. 2) C】Equalize
    【Manthan, Codefest 18 (rated, Div. 1 + Div. 2) B】Reach Median
    工作总结二
    学习总结
    快速WCF
    EF+linq的增删改查
    JAVASCRIPT闭包以及原型链
    CSS声明各个浏览器私有属性的命名前缀
    mvc的model验证,ajaxhelper,验证机制语法
  • 原文地址:https://www.cnblogs.com/zhiqsyr/p/6963754.html
Copyright © 2011-2022 走看看