【发布时间】:2018-11-13 15:06:05
【问题描述】:
我正在开发基于 SpringBoot 的相当简单的 RESTful 服务。我正在使用 Ebean 和 SpringData。我所有的 REST 方法都用 @Transactional 注释:
@Transactional
@PostMapping
public Entity createEntity(...) {
// some code
}
我面临的问题是,如果存在网络问题但此方法无异常执行,事务仍将被提交。例如,客户端可能会发送数据,我的代码会创建记录,但服务器无法将响应发送回客户端。在这种情况下,我希望事务回滚,但我没有找到这样做的方法。
在这种情况下甚至可以回滚事务吗?也许我忽略了一个 Spring 平台限制。
谢谢
编辑:回答下面的答复并进一步说明问题:回滚事务很容易。棘手的部分是运行任何代码以响应网络故障。我希望我可以配置 Spring 来为我做这件事。就像“等到你发送了最后一个字节,然后回滚或提交事务”。我当前的代码将在 createEntity() 方法完成后立即提交事务。
【问题讨论】:
-
你是怎么解决这个问题的?
-
@humbleCoder 我没有。现在想想,我觉得根本不值得解决。即使您发送数据,客户端也可能无法读取它(即在解析响应期间崩溃)。因此,您只需要接受这样一个事实,即即使您的事务已提交,客户端也可能不知道。
-
这可能是一个值得解决的严重问题。考虑一个场景,客户端发送了一个 HTTP POST 请求,该请求在服务器数据库中创建了一个实体。服务器创建实体并发回其 ID。但是,客户端在解析来自服务器的响应的过程中崩溃了。后来,当客户端开始运行时,它无法知道这样的实体是否是由服务器创建的以及引用它的方式,因为它无法捕获 ID。客户应该怎么做?它是否应该再次发送 POST 请求,从而可能创建一个类似的实体?
标签: java spring spring-transactions