当前位置: 首页 > 知识库问答 >
问题:

外行术语中的Spring传播示例

狄子真
2023-03-14

Spring文档在描述事务传播属性方面做得非常出色。

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

共有1个答案

诸葛苏燕
2023-03-14

需要进行传播

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

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

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

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

当do某物()返回时,事务还没有提交。是调用方将提交事务(或可能回滚)。

PROPAGATION_REQUIRES_NEW

class Service {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void doSomething() {
        // access a database using a DAO
    }
}

调用doSomething()时,它将始终启动新事务。

如果此方法的调用方已经启动了一个事务(Txn外层),那么调用方的事务将被挂起,并创建一个新事务(TxnIN)(即有两个事务在玩)。

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

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

需要注意的重要一点是,数据库将Txn外层和Txn内部视为完全独立的事务,因此有两个独立的提交。

PROPAGATION_NESTED

class Service {
    @Transactional(propagation=Propagation.NESTED)
    public void doSomething() {
        // access a database using a DAO
    }
}

只有当JDBC驱动程序和/或数据库支持JDBC保存点时,才能使用嵌套

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

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

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

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

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

 类似资料:
  • 问题内容: Spring文档在描述事务传播属性方面做得非常出色。 但是,我想知道是否有可用的众所周知的真实示例以通俗易懂的方式更全面地描述每个属性? 问题答案: PROPAGATION_REQUIRED 如果调用者尚未启动 事务, 则在调用 doSomething()时它将启动新 事务 。 如果此方法的调用者已经开始事务,则使用调用者的事务,并且不会创建新的事务(即,正在运行一个事务)。 如果在d

  • 我们目前正在使用侦探2.2.3. RELEASE,我们看不到在超文本传输协议标头中传递的字段userId没有传播。下面是我们的代码。 我们怀疑YML文件中的某些问题。我们尝试了以下所有选项,但均无效。 在回退中: %X{行李用户ID:-} 我们在超文本传输协议头中传递userId。

  • 问题内容: 考虑以下示例代码 在这里,价值和是完全相同且等于 ,所以, 两者之间到底有什么区别? 哪一个效率更高?为什么? 传播语法的确切用途是什么? 您是否不认为以正式的广泛语言引入这些小捷径可能会留下一些未被注意的错误,我的意思是要么根本没有必要,要么我没有意识到确实需要这样做。 问题答案: 在给出的示例中,两者之间基本上没有区别 是显著更有效:http://jsperf.com/spread

  • 我第一次使用侦探需要一些帮助。我目前正在使用sleuth 2.2.3。释放我的要求是我想传播两个字段product id和product type,这样我就可以从其他微服务中读取这两个值,因为我正在使用baggage传播。

  • 问题内容: 我听说过这两种语言都称为“传播语法”和“传播算子”,后者更为流行。有关MDN文档的URL表明,它最初被称为扩展运算符,但后来更改为扩展语法,而MDN的运算符列表未提及它。 Google似乎建议使用术语“运营商”来普及和接受,例如Microsoft文档和[es6-features.org]等网站都将其称为“运营商”。 在ECMAScript的上下文中,哪一个术语最正确(如果有),为什么?

  • 我试图理解Spring事务概念。如下所示,我必须将数据插入两个不同的数据库(iSeries和DB2),但我们的iSeries版本不支持两阶段提交。要求是,只有当两个插入都成功时才应该提交事务,否则应该回滚。 如果我根据需要使用传播或REQUIRES\u NEW,我会得到错误“非法尝试使用现有的两阶段资源提交一阶段资源”。 但是如果我使用NOT_SUPPORTED或支持,它工作正常(即如果其中一个插