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()的调用者已经启动事务的场景有关