I have the following code:
@Transactional
public void handle() {
for (Item item : getItems()) {
handle(item);
}
}
@Transactional(propagation = Propagation.NESTED)
public void handle(Item item) {
/* logic here */
}
假设在handle()
循环处理10个项目,其中3个项目会抛出异常。
我的问题是:
[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 */
}
根据文档,我了解到使用
REQUIRES_NEW
会启动一个新的事务并挂起活动事务。这与NESTED
不同,后者创建保存点且当前事务仍在使用。但是我认为,在使用REQUIRES_NEW
时,7项更改将被提交,而其他3项的中间更改将被忽略。那么,真正的区别是什么呢(如果有的话)?