微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Spring:事务传播

我有以下代码

@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] 举报,一经查实,本站将立刻删除。

相关推荐