【问题标题】:PROPAGATION_NESTED vs PROPAGATION_Required in spring?春季需要 PROPAGATION_NESTED 与 PROPAGATION_Required?
【发布时间】:2011-07-13 18:44:13
【问题描述】:

实际上是在寻找 PROPAGATION_NESTED(如果存在当前事务,则在嵌套事务中执行)和 PROPAGATION_Required(支持当前事务)之间的区别。

下面是简单的用例

说在主类中我们调用 method1 并使用 jdbc[Transaction1] 创建客户。尚未提交。现在我们在主类中调用 method2 并为刚刚创建的客户 [Transaction2] 创建帐户。现在提交它。我们可以将事务 2 称为嵌套事务吗?

根据我现在的理解,如果我们将事务定义定义为 PROPAGATION_NESTED

事务 2 将被视为嵌套,但如果我们将其定义为 PROPAGATION_Required 它将支持当前事务。那么嵌套和必需的区别是什么?

【问题讨论】:

    标签: spring transactions


    【解决方案1】:

    PROPAGATION_NESTED 只能与DataSourceTransactionManager 和 JDBC3 驱动程序一起使用。它使用保存点以便能够回滚事务的某些部分(即在 Spring 术语中构成嵌套事务的内容)。请参阅javadoc of Connection 了解保存点的工作原理。

    REQUIRED 完全不同。它只是意味着:如果已经存在事务,则在此事务中进行工作;否则,开始一个新事务,完成工作并提交事务。

    【讨论】:

    • 以这个例子为例,在主类中我们调用 method1 并使用 jdbc[Transaction1] 创建客户。尚未提交。现在我们在主类中调用 method2 并为刚刚创建的客户 [Transaction2] 创建帐户。现在提交它。根据您的解释,这两个事务都将被视为一个事务的一部分(因为一个连接最多可以有一个事务)但是如果我们使用保存点来部分回滚或提交,我们将事务 2 称为嵌套事务。这是正确的吗?
    【解决方案2】:

    因为您正在使用带有必需/嵌套传播的 Spring,所以问题中提到的 [Transaction1] 和 [Transaction2] 是“相同的事务”。

    作为您的用例,如果您在 method2() 上使用“必需”

    @Transaction(Require)
    main() {
        // throw new Exception(); => rollback all
        method1();
        method2();
        // throw new Exception(); => rollback all
    }
    
    @Transaction(Require)
    method1() {
        // throw new Exception(); => rollback all
    }
    
    @Transaction(Require)
    method2() {
        // throw new Exception(); => rollback all
    }
    

    如果你在method2()上使用嵌套

    @Transaction(Require)
    main() {
        // throw new Exception(); => rollback all
        method1();
    
        // Create Save Point A
        method2();
        // Release Save Point A
    
        // throw new Exception(); => rollback all
    }
    
    @Transaction(Require)
    method1() {
        // throw new Exception(); => rollback all
    }
    
    @Transaction(Nested) // is the same transaction as main
    method2() {
        // throw new Exception(); => will only rollback to Save Point A
    }
    

    嵌套事务的用例

    (当一个客户需要一百万个帐户,并且需要几个小时才能完成所有任务)

    好处 =>

    1. 一个账户创建失败不会全部回滚(只回滚失败的账户=>然后可以开始调试)[节省公司有处理大量独立数据的午夜批处理的时间]

    2. 它们都在同一个连接/事务中[与需要新资源相比节省资源]

    例如:

    @Transaction(Require)
    main() {
        // throw new Exception(); => rollback all
        method1();
    
        for(many time) {
            // Create Save Point
            method2();
            // Release Save Point
        }
    
        // throw new Exception(); => rollback all (Be careful, it will rollback all!!!)
    }
    
    @Transaction(Require)
    method1() {
        // throw new Exception(); => rollback all
    }
    
    @Transaction(Nested) // is the same transaction as main
    method2() {
        // throw new Exception(); => will only rollback to Save Point
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2020-07-23
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多