一尘不染

有没有办法在没有遇到异常的情况下强制进行事务回滚?

hibernate

我有一种方法可以做很多事情。其中包括进行大量插入和更新。因此宣布…

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

它的工作完全符合预期,我对此没有任何问题。但是在某些情况下,尽管没有异常,但我还是想强制回滚…目前,当我遇到合适的条件时,我正在强制异常,但这很丑陋,我不喜欢它。

我可以以某种方式积极地调用回滚吗?异常调用它…我在想也许我也可以。


阅读 550

收藏
2020-06-20

共1个答案

一尘不染

在Spring Transactions中,您使用TransactionStatus.setRollbackOnly()

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

如果要严格控制交易状态,则必须使用程序化交易,而不是声明性注释。这意味着使用Spring的TransactionTemplate,或直接使用其PlatformTransactionManager。请参阅Spring参考手册的9.6节。

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

它不如@Transactional,但您可以更精确地控制自己的发送状态。

2020-06-20