gpt4 book ai didi

java - 外行术语中的 Spring 传播示例

转载 作者:IT老高 更新时间:2023-10-28 13:48:54 26 4
gpt4 key购买 nike

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

但是,我想知道是否有任何众所周知的真实示例可用外行术语更全面地描述这些属性中的每一个?

最佳答案

PROPAGATION_REQUIRED

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

当 doSomething() 被调用时,它会开始一个新的事务如果调用者还没有开始一个事务

如果该方法的调用者已经启动了一个事务,那么调用者的事务将被使用并且不会创建新的事务(即有一个事务在进行中)。

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

当 doSomething() 返回时,事务还没有提交。提交事务(或可能回滚)的是调用者。

PROPAGATION_REQUIRES_NEW

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 视为完全独立的事务,因此是两个独立的提交。

PROPAGATION_NESTED

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

只有在您的 JDBC 驱动程序和/或数据库支持 JDBC savepoints 时才能使用 NESTED

当 doSomething() 被调用时,它会开始一个新的事务如果调用者还没有开始一个事务

如果这个方法的调用者已经开始了一个事务,那么调用者的事务被使用并且没有新的事务被创建(即有一个事务在运行)。但是,当输入 doSomething() 时,事务上会标记一个“保存点”。

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

当 doSomething() 返回时没有异常,调用者将提交整个事务(或回滚)。

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

关于java - 外行术语中的 Spring 传播示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25076718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com