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

新手上路,请多包涵

我有一个方法可以做很多事情;其中包括一些插入和更新。

它是这样声明的:

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

它完全按照预期工作,我没有遇到任何问题。然而,在某些情况下,尽管没有例外,我还是想强制回滚……目前,当我遇到正确的条件时,我会强制执行一个例外,但它很丑陋,我不喜欢它。

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

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

原文由 Yevgeny Simkin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 816
2 个回答

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

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

如果你想严格控制你的事务状态,你必须使用程序化事务而不是声明性注释。这意味着使用 Spring 的 TransactionTemplate,或者直接使用它的 PlatformTransactionManager。请参阅 Spring 参考手册的第 9.6 节。

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

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

原文由 skaffman 发布,翻译遵循 CC BY-SA 3.0 许可协议

这对我有用:

 TransactionInterceptor.currentTransactionStatus().setRollbackOnly();

原文由 Melquiades Fagundez 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题