Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 外行中的弹簧传播示例';s条款_Java_Spring_Annotations_Transactional_Propagation - Fatal编程技术网

Java 外行中的弹簧传播示例';s条款

Java 外行中的弹簧传播示例';s条款,java,spring,annotations,transactional,propagation,Java,Spring,Annotations,Transactional,Propagation,在描述事务传播属性方面做得非常好 然而,我想知道是否有任何已知的、真实的例子可以用外行的术语更全面地描述这些属性?需要传播 class Service { @Transactional(propagation=Propagation.REQUIRED) public void doSomething() { // access a database using a DAO } } class Service { @Transactional(pr

在描述事务传播属性方面做得非常好


然而,我想知道是否有任何已知的、真实的例子可以用外行的术语更全面地描述这些属性?

需要传播

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}
class Service {
    @Transactional(propagation=Propagation.NESTED)
    public void doSomething() {
        // access a database using a DAO
    }
}
调用doSomething()时,如果调用方尚未启动事务,它将启动新事务

如果此方法的调用方已启动事务,则将使用调用方的事务,并且不会创建新事务(即有一个事务正在进行)

如果在doSomething()中抛出异常,那么它将回滚,这意味着调用方也将看到事务回滚

当doSomething()返回时,事务将尚未提交。调用方将提交事务(或可能回滚)


传播需要新的

class Service {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void doSomething() {
        // access a database using a DAO
    }
}
调用doSomething()时,它将始终启动新事务

如果此方法的调用方已经启动了一个事务(TxnOuter),则调用方的事务将被挂起,并创建一个新事务(TxnInner)(即有两个事务在进行中)

如果在doSomething()中抛出异常,则TxnInner将回滚,但来自调用方(TxnOuter)的“挂起”事务不受影响

当doSomething()毫无例外地返回时,它将提交事务(TxnInner)。调用方的事务(TxnOuter)将被恢复,并且不知道提交了另一个事务。然后,调用方可以根据需要提交或回滚TxnOuter

需要注意的重要一点是,数据库将TxnOuter和TxnInner视为完全独立的事务,因此是两个独立的提交

传播\u嵌套

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}
class Service {
    @Transactional(propagation=Propagation.NESTED)
    public void doSomething() {
        // access a database using a DAO
    }
}
只有在JDBC驱动程序和/或数据库支持的情况下,才能使用嵌套

调用doSomething()时,如果调用方尚未启动事务,它将启动新事务

如果此方法的调用方已启动事务,则将使用调用方的事务,并且不会创建新事务(即有一个事务正在进行)。但是,当输入doSomething()时,事务上会标记一个“保存点”

如果在doSomething()中抛出异常,则可以将事务部分回滚到“保存点”。调用方将继续处理事务

当doSomething()毫无例外地返回时,调用方将提交整个事务(或回滚)


需要注意的重要一点是,数据库只查看一个事务,只有一个提交。

我建议您这样做,这对我非常有用。人们已经找到了我的外行关于有用的答案(不是公认的答案)。谢谢@Brad这是一个很好的答案,正是我想要的。你介意把它扩展到其他类型的传播吗?这太棒了,布拉德。正是我想要的,谢谢!对于第一次使用spring的人来说,理解spring参考似乎有点复杂。很好的解释。简单..您的答案是一个参考模式—文档应该如何编写。非常感谢。很好的解释。但为了避免混淆,引用与传播相关的部分。必需:
“当doSomething()返回时,事务将尚未提交。将提交事务(或可能回滚)的是调用方。
”。你可能是说,如果最初它是一个调用方的事务(即不是新的),对吗?因为如果是新事务(即由带注释的函数创建),它必须在函数末尾提交(以防一切顺利)。是@informatik01,您是正确的。这句话与doSomething()的调用者已经启动事务的场景有关