强制事务回滚而不遇到异常?

2022-08-31 20:10:18

我有一种方法可以做很多事情;其中他们做了一些插入和更新。

它是这样声明的:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
public int saveAll() {
 //do stuff;
}

它完全按照预期工作,我对此没有问题。但是,在某些情况下,尽管没有例外,但我想强制回滚...目前,当我遇到合适的条件时,我会强制例外,但它很丑陋,我不喜欢它。

我可以以某种方式主动调用回滚吗?

异常调用它...我想也许我也可以。


答案 1

在春季交易中,您可以使用 .TransactionStatus.setRollbackOnly()

您在这里遇到的问题是,您正在使用来划分您的交易。这具有非侵入性的好处,但这也意味着,如果您想手动与事务上下文进行交互,则不能。@Transactional

如果要严格控制事务状态,则必须使用编程事务而不是声明性注释。这意味着使用Spring的TransalageTemplate,或直接使用其AnformTransactionManager。请参阅弹簧参考手册的第9.6节。

使用 ,您可以提供一个实现 的回调对象,并且此回调中的代码可以访问这些对象。TransactionTemplateTransactionCallbackTransactionStatus

它不如 好,但您可以更紧密地控制 tx 状态。@Transactional


答案 2

这对我有用:

TransactionInterceptor.currentTransactionStatus().setRollbackOnly();

推荐