网络故障后回滚Spring事务

时间:2018-06-04 09:55:12

标签: java spring spring-transactions

我正在开发基于SpringBoot的简单RESTful服务。我使用的是Ebean和SpringData。我的所有REST方法都使用@Transactional注释:

@Transactional
@PostMapping
public Entity createEntity(...) {
   // some code
}

我面临的问题是,如果存在网络问题,但此方法无异常地执行,则事务仍将被提交。例如,客户端可能会发送数据,我的代码会创建记录,但服务器无法将响应发送回客户端。在这种情况下,我希望事务能够回滚,但我还没有找到一种方法。

在这种情况下甚至可以回滚事务吗?也许有一个我可以忽略的Spring平台限制。

由于

编辑:要回答下面的回复并进一步指出问题:回滚交易很容易。棘手的部分是运行任何代码以响应网络故障。我希望我能配置Spring为我做这件事。喜欢"等到你发送最后一个字节然后回滚或提交事务"。我的当前代码将在createEntity()方法完成后立即提交事务。

3 个答案:

答案 0 :(得分:1)

这不是Spring框架的限制。一旦成功执行该方法,弹出框架的@Transactional责任就不能回滚。

你能做的最好就是拥有一个ExceptionHandler。请参阅此答案以获得更好的观点:https://stackoverflow.com/a/45034574/945214

您可以做的另一件事是提高整个HTTP请求拓扑的性能,以便这种潜在故障的概率降低(随着触摸时间的减少)。请参阅我在https://www.linkedin.com/pulse/improving-website-performance-kshitiz-garg/

上的应用效果简报

答案 1 :(得分:0)

如果你能找到你需要回滚的时间(检查返回状态/ ...),你可以抛出自己的例外。

警告,因为它只回滚未经检查的异常(否则,如果您希望它回滚任何异常,则需要在rollbackFor=Exception.class上添加@Transactional

见:

https://www.catalysts.cc/wissenswertes/spring-transactional-rollback-on-checked-exceptions/

Annotation @Transactional. How to rollback?

答案 2 :(得分:0)

您可以使用以下命令回滚事务而不抛出异常:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();