【发布时间】:2017-11-22 16:35:55
【问题描述】:
我有以下代码:
@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 */
}
根据我对文档的理解,这里将启动一个新事务,并且将暂停活动事务。这与NESTED 不同,后者创建了一个保存点并且仍在使用当前事务。但我相信,REQUIRES_NEW 也将提交 7 项的更改,而其他 3 项的任何中间更改都将被遗忘。
那么真正的区别是什么(如果有的话)?
【问题讨论】:
-
在这种情况下,您只有一个事务。它将被提交或回滚。没有外在的关系
-
@sbjavateam 需要解释一下吗?
-
您从同一服务中的另一个事务方法调用一个事务方法。 spring 事务与代理一起工作,在你的情况下 spring 不会为第二次调用启动新事务
-
@sbjavateam 这应该适用于 AspectJ?
-
与 AspectJ - 是的
标签: java spring postgresql transactions spring-transactions