@Transactional
public void handle() {
for (Item item : getItems()) {
handle(item);
}
}
@Transactional(propagation = Propagation.nesTED)
public void handle(Item item) {
/* logic here */
}
假设handle()中的循环处理10个项目.还假设对于3个项目句柄(Item)将抛出异常.
我的问题:
[1]外部交易是否会在第10项之后提交?这意味着将提交7个项目的必要更改,并且其他3个项目的任何中间更改将回滚到创建的保存点?
[2]句柄(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个项目的任何中间更改都将被遗忘.
那么真正的区别是什么(如果有的话)?
解决方法:
nesTED开始主要的子交易. REQUIRES_NEW开始单独交易.
如果在方法之后使用REQUIRES_NEW标记方法,则无论外部事务发生什么,数据都保留在DB中(由单独的事务提交).
在nesTED的情况下,如果外部事务被回滚,则更改将被回滚.
见答案here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。