Spring 需要澄清的春天

Spring 需要澄清的春天,spring,jakarta-ee,transactions,Spring,Jakarta Ee,Transactions,希望通过以下场景阐明所需的传播。请让我知道下面的理解是否正确 Class MyClass1{ //Propagation is Propagation required public void method1(); { method1A(); method1B(); MyClass2 myClass2= new MyClass2(); myClass2.method2A(); myClass2.method2B(); } // No porapgation is defined here

希望通过以下场景阐明所需的传播。请让我知道下面的理解是否正确

Class MyClass1{

//Propagation is Propagation required
public void method1();
{

method1A();
method1B();
MyClass2 myClass2= new MyClass2();
myClass2.method2A();
myClass2.method2B();
}


// No porapgation is defined here so default will be reuired
public method1A()
{
//Some Transaction
}


// No porapgation is defined here so default will be reuired
private method1B()
{
//Some Transaction
}

}



Class MyClass2{

//Propagation is Propagation required
public void method2()
{

method2A();
method2B();
}


// No porapgation is defined here so default will be required
public method2A()
{
//Some Transaction
}


// No porapgation is defined here so default will be required
public method2B()
{
//Some Transaction
}

}
下面是一些场景

我们在main方法中调用MyClass1的method1()

场景1:-

没有例外。事务将在method1A()之前创建,并在myClass2.method2B()之后提交

场景2:-

method1B期间发生运行时异常。完成的事务将回滚

场景3:-

method2A期间发生运行时异常(method2A下的事务将被视为创建的事务的一部分 在类1)中的method1下)。完整事务将回滚

场景4:-

method2B期间发生运行时异常(method2A下的事务将被视为创建的事务的一部分 在类1)中的method1下)。完整事务将回滚

编辑:-

现在,如果我们考虑与方法嵌套的相同场景,方法2A和方法2B.

场景1:-

没有例外。事务将在进入method1A()时创建,并在method1A()退出时提交

场景2:-

method1B期间发生运行时异常。完成的事务将回滚

场景3:-

method2A期间发生运行时异常。只有method2A下的事务将回滚,其余事务将提交 关于方法1的退出

场景4:-

method2B期间发生运行时异常。只有method2B下的事务将回滚,其余事务将提交 方法1退出时,您的理解(通常)是正确的,但您的示例有缺陷。致电:

MyClass2 myClass2= new MyClass2();
您已经确保了myClass2上的方法调用不会被事务代理截获,因此此处隐含的任何传播所需的语义实际上并不重要,因为它们不会被应用。但是,在本例中,您将属于method1的事务边界,并且由于您已将其标记为需要传播,因此您的代码将按照您所描述的方式执行。如果您需要进一步的澄清,您最好提出一个解决方案

另外,上的Spring文档是您可以找到的最好的文档之一,我强烈建议您查看一下。

您的理解(通常)是正确的,但您的示例有缺陷。致电:

MyClass2 myClass2= new MyClass2();
您已经确保了myClass2上的方法调用不会被事务代理截获,因此此处隐含的任何传播所需的语义实际上并不重要,因为它们不会被应用。但是,在本例中,您将属于method1的事务边界,并且由于您已将其标记为需要传播,因此您的代码将按照您所描述的方式执行。如果您需要进一步的澄清,您最好提出一个解决方案


另外,上的Spring文档是您可以找到的最好的文档之一,我强烈建议您看看。

谢谢Jonathan。我同意你的观点,这个例子是有缺陷的,因为MyClass2 MyClass2=newmyclass2();我应该从beanfactory那里得到这个对象。Jonathan如果你也能确认对嵌套场景的理解,那将是非常有帮助的。谢谢Hanks Jonathan。我同意你的观点,这个例子是有缺陷的,因为MyClass2 MyClass2=newmyclass2();我应该从beanfactory那里得到这个对象。Jonathan如果你也能确认对嵌套场景的理解,那将非常有帮助。提前谢谢