Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 网络故障后回滚Spring事务_Java_Spring_Spring Transactions - Fatal编程技术网

Java 网络故障后回滚Spring事务

Java 网络故障后回滚Spring事务,java,spring,spring-transactions,Java,Spring,Spring Transactions,我正在基于SpringBoot开发相当简单的RESTful服务。我用的是Eben和SpringData。我的所有REST方法都用@Transactional注释: @Transactional @PostMapping public Entity createEntity(...) { // some code } 我面临的问题是,如果存在网络问题,但此方法执行时没有异常,则事务仍将被提交。例如,客户端可能会发送数据,“我的代码”会创建记录,但服务器无法将响应发送回客户端。在这种情况下,

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

@Transactional
@PostMapping
public Entity createEntity(...) {
   // some code
}
我面临的问题是,如果存在网络问题,但此方法执行时没有异常,则事务仍将被提交。例如,客户端可能会发送数据,“我的代码”会创建记录,但服务器无法将响应发送回客户端。在这种情况下,我希望事务回滚,但我没有找到这样做的方法

在这种情况下甚至可以回滚事务吗?也许我忽略了Spring平台的局限性

谢谢


编辑:回答下面的答复并进一步指定问题:回滚事务非常容易。棘手的部分是运行任何代码来响应网络故障。我希望我可以配置Spring来为我做这件事。比如“等待发送最后一个字节,然后回滚或提交事务”。我的当前代码将在createEntity()方法完成后立即提交事务。

如果您能确定何时需要回滚(检查返回状态/…),您可以抛出自己的异常

请注意,因为它只针对未检查的异常进行回滚(否则,如果希望它针对任何异常进行回滚,则需要在
@Transactional
上添加
rollbackor=Exception.class

见:


您可以使用以下方法回滚事务而不引发异常:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

这不是Spring框架的限制。一旦该方法成功执行,spring framework的
@Transactional
就没有责任回滚它

你能做的最好的事情就是有一个例外处理程序。请参阅此答案以获得更好的视角:


您可以做的另一件事是改进整个HTTP请求拓扑的性能,以便降低此类潜在故障的概率(随着接触时间的减少)。请参阅我在以下位置撰写的关于应用程序性能的文章:

您是如何解决此问题的?@humbecoder我没有。在我现在思考的时候,我认为它甚至不值得解决。即使您发送数据,客户端也可能无法读取数据(即在解析响应时崩溃)。因此,您必须接受这样一个事实:即使您提交了事务,客户机也可能不知道。