我有一个方法可以做很多事情;其中包括一些插入和更新。
它是这样声明的:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
public int saveAll() {
//do stuff;
}
它完全按照预期工作,我没有遇到任何问题。然而,在某些情况下,尽管没有例外,我还是想强制回滚……目前,当我遇到正确的条件时,我会强制执行一个例外,但它很丑陋,我不喜欢它。
我可以以某种方式主动调用回滚吗?
异常调用它……我在想也许我也可以。
原文由 Yevgeny Simkin 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Spring Transactions 中,您使用
TransactionStatus.setRollbackOnly()
。你在这里遇到的问题是你正在使用
@Transactional
来划分你的交易。这具有非侵入性的好处,但也意味着如果您想手动与事务上下文交互,则不能。如果你想严格控制你的事务状态,你必须使用程序化事务而不是声明性注释。这意味着使用 Spring 的 TransactionTemplate,或者直接使用它的 PlatformTransactionManager。请参阅 Spring 参考手册的第 9.6 节。
使用
TransactionTemplate
,您提供一个实现TransactionCallback
的回调对象,并且此回调中的代码可以访问TransactionStatus
它不如
@Transactional
好,但您可以更紧密地控制您的 tx 状态。