gpt4 book ai didi

java - 事务的传播行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:26:52 26 4
gpt4 key购买 nike

我正在为 spring aop 使用基于注释的声明方法。示例代码

ClassA{
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
add()
{
method1();
method2();
method3();

}
}

但是我对propagation的使用还是存疑,是否propagation.Requires_New表示每次请求都会开启新的transaction

第二个问题:

method2,method3等方法失败会导致事务回滚吗?

如果有什么可以帮助我学习交易传播,我将非常高兴。

有人能给我一个我们需要参与现有交易的真实世界的例子吗?因为我想象我们在上面的例子中使用的添加功能对所有用户都是独立的,或者任何其他功能对每个用户都是独立的是谁打来的。我无法找到使用其他传播行为(如 PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW 等)的示例

最佳答案

回答这个评论,而不是实际的问题:

transaction are session specific or request specific – Vish 3 hours ago

都没有。 request 和 session 都是 web 特定的范围,而 Spring Transaction 抽象与 web 技术无关。

@Transactional 的范围是每个方法调用,因为 @Transactional 是通过 Spring AOP 实现的。事务状态保存在 ThreadLocal 变量中,这些变量在进入最外层的 @Transactional 方法时初始化,并在离开时通过提交或回滚清除。整个抽象工作在 Java 方法级别,因此不需要 Web 容器或从中获益。


并在下面的评论中回应这个问题:

thanks @sean,i am stil not able to get answer where other propagation behaviour like PROPAGATION_SUPPORTS ,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW etc are used. please refer above for whole question

这是 Propagation 的列表值(value)观与我的评论:

MANDATORY
Support a current transaction, throw an exception if none exists.

不启动新的事务,只检查事务是否处于 Activity 状态(必须在另一个 @Transactional 方法调用或以编程方式创建的事务中)

NESTED
Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else.

如果事务存在则启动嵌套事务,否则启动新事务。

NEVER
Execute non-transactionally, throw an exception if a transaction exists.

不启动事务。如果存在事务则失败。

NOT_SUPPORTED
Execute non-transactionally, suspend the current transaction if one exists.

不启动事务。暂停任何现有交易。

REQUIRED
Support a current transaction, create a new one if none exists.

如果交易存在,则使用它,如果不存在,则创建一个新交易。 在 95% 的情况下,这就是您所需要的。

REQUIRES_NEW
Create a new transaction, suspend the current transaction if one exists.

总是创建一个新的交易,无论是否存在现有的交易。如果存在,它将在该方法执行期间被挂起。

SUPPORTS
Support a current transaction, execute non-transactionally if none exists.

如果存在事务,则可以使用事务,但不需要事务(也不会启动新事务)


在大多数情况下,REQUIRED 是您所需要的(因此它是 @Transactional 注释中的默认值)。我个人从未见过使用 REQUIREDREQUIRES_NEW 的任何其他值。

关于java - 事务的传播行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5550568/

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