【发布时间】:2017-08-28 02:06:08
【问题描述】:
考虑Spring MVC java web-application,它提供了一些REST API。
假设它有很多方法,其中之一是DELETE /api/foo/{id},它显然会从数据库中删除foo 给定id 的实体。
问题是由于数据库中的大数据,这个操作不是立即的,所以如果客户端尝试同时对同一个实体执行多次删除操作,比如说
DELETE /api/foo/123 x N 次(当然是客户端软件错误),
它会在数据库中引起一些令人不快的副作用(你知道,如果你尝试在多个事务中删除相同的实体,那通常不是很好)。
我的问题是:Spring MVC 中防止此类情况的最佳做法是什么?
我当然可以在每个这样的更新方法 (PUT/DELETE) 中引入 Foo id 上的同步。我需要为所有实体和所有PUT/DELETE API 方法执行此操作,但我真的不想这样做。我想它应该是一些优雅而漂亮的解决方案,如何在拦截器/servlet级别执行这种类型的同步,即不在控制器级别的服务上。
我还可以创建特定的拦截器并在那里等待重复的请求(具有相同 URL 和参数的请求)。但同样,这听起来不是一个优雅的解决方案(直到我确保无法以某种更美观的方式在 Spring MVC 中进行配置)。
【问题讨论】:
-
原则上,事务机制就是为此目的而设计的。您还有哪些进一步要求将事务回滚视为数据库中令人不快的副作用?
-
是的,问题是不同的数据库对此类事件有不同的行为。就我而言,由于复杂的复制结构,我遇到了某种阻塞。我通常不想从数据库中捕获和接收任何类型的此类异常,我想阻止它们的出现。
-
我是对还是错。我不知道据我所知我们可以做一件事,只是检查数据库中的数据是否可用,或者不像 getFooById(id);如果你得到的数据比你可以删除相同的数据,否则你可以抛出数据不存在的异常
标签: java spring rest api spring-mvc