我正在开发基于SpringBoot的简单RESTful服务。我使用的是Ebean和SpringData。我的所有REST方法都使用@Transactional注释:
@Transactional
@PostMapping
public Entity createEntity(...) {
// some code
}
我面临的问题是,如果存在网络问题,但此方法无异常地执行,则事务仍将被提交。例如,客户端可能会发送数据,我的代码会创建记录,但服务器无法将响应发送回客户端。在这种情况下,我希望事务能够回滚,但我还没有找到一种方法。
在这种情况下甚至可以回滚事务吗?也许有一个我可以忽略的Spring平台限制。
由于
编辑:要回答下面的回复并进一步指出问题:回滚交易很容易。棘手的部分是运行任何代码以响应网络故障。我希望我能配置Spring为我做这件事。喜欢"等到你发送最后一个字节然后回滚或提交事务"。我的当前代码将在createEntity()方法完成后立即提交事务。
答案 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/
答案 2 :(得分:0)
您可以使用以下命令回滚事务而不抛出异常:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();