Java 网络故障后回滚Spring事务
我正在基于SpringBoot开发相当简单的RESTful服务。我用的是Eben和SpringData。我的所有REST方法都用@Transactional注释:Java 网络故障后回滚Spring事务,java,spring,spring-transactions,Java,Spring,Spring Transactions,我正在基于SpringBoot开发相当简单的RESTful服务。我用的是Eben和SpringData。我的所有REST方法都用@Transactional注释: @Transactional @PostMapping public Entity createEntity(...) { // some code } 我面临的问题是,如果存在网络问题,但此方法执行时没有异常,则事务仍将被提交。例如,客户端可能会发送数据,“我的代码”会创建记录,但服务器无法将响应发送回客户端。在这种情况下,
@Transactional
@PostMapping
public Entity createEntity(...) {
// some code
}
我面临的问题是,如果存在网络问题,但此方法执行时没有异常,则事务仍将被提交。例如,客户端可能会发送数据,“我的代码”会创建记录,但服务器无法将响应发送回客户端。在这种情况下,我希望事务回滚,但我没有找到这样做的方法
在这种情况下甚至可以回滚事务吗?也许我忽略了Spring平台的局限性
谢谢
编辑:回答下面的答复并进一步指定问题:回滚事务非常容易。棘手的部分是运行任何代码来响应网络故障。我希望我可以配置Spring来为我做这件事。比如“等待发送最后一个字节,然后回滚或提交事务”。我的当前代码将在createEntity()方法完成后立即提交事务。如果您能确定何时需要回滚(检查返回状态/…),您可以抛出自己的异常 请注意,因为它只针对未检查的异常进行回滚(否则,如果希望它针对任何异常进行回滚,则需要在
@Transactional
上添加rollbackor=Exception.class
)
见:
您可以使用以下方法回滚事务而不引发异常:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
这不是Spring框架的限制。一旦该方法成功执行,spring framework的
@Transactional
就没有责任回滚它
你能做的最好的事情就是有一个例外处理程序。请参阅此答案以获得更好的视角:
您可以做的另一件事是改进整个HTTP请求拓扑的性能,以便降低此类潜在故障的概率(随着接触时间的减少)。请参阅我在以下位置撰写的关于应用程序性能的文章:您是如何解决此问题的?@humbecoder我没有。在我现在思考的时候,我认为它甚至不值得解决。即使您发送数据,客户端也可能无法读取数据(即在解析响应时崩溃)。因此,您必须接受这样一个事实:即使您提交了事务,客户机也可能不知道。