gpt4 book ai didi

java - Spring:事务传播

转载 作者:搜寻专家 更新时间:2023-11-01 02:58:31 26 4
gpt4 key购买 nike

我有以下代码:

@Transactional
public void handle() {
for (Item item : getItems()) {
handle(item);
}
}

@Transactional(propagation = Propagation.NESTED)
public void handle(Item item) {
/* logic here */
}

假设 handle() 中的循环处理 10 个项目。还假设对于 3 个项目 handle(Item) 将抛出异常。

我的问题:

[1] 外层事务会在第10项之后提交吗?这意味着将提交 7 个项目的必要更改,而其他 3 个项目的任何中间更改都将回滚到创建时的保存点?

[2] handle(Item) 中的异常是否会被捕获而不转发给handle()?这是由 @Transactional 完成的吗?

[3] 此外,我想了解以下流程在行为上的区别是什么:

@Transactional
public void handle() {
for (Item item : getItems()) {
handle(item);
}
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void handle(Item item) {
/* logic here */
}

根据我对文档的理解,这里将启动一个新事务并暂停 Activity 事务。这与 NESTED 不同,后者创建了一个保存点并且当前事务仍在使用。但我相信这里同样使用 REQUIRES_NEW 将提交 7 个项目的更改,并且将忘记其他 3 个项目的任何中间更改。

那么真正的区别是什么(如果有的话)?

最佳答案

NESTED 启动主事务的子事务。 REQUIRES_NEW 开始单独的事务。

如果在方法退出数据保留在 DB 中(由单独的事务提交)之后用 REQUIRES_NEW 标记一个方法,无论外部事务发生什么。

在 NESTED 的情况下,如果回滚外部事务,则更改将被回滚。

查看答案 here

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

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