gpt4 book ai didi

java - 防止 REST 客户端同时执行具有相同参数的相同方法

转载 作者:行者123 更新时间:2023-11-30 10:31:30 25 4
gpt4 key购买 nike

考虑 Spring MVC java web 应用程序,它提供了一些 REST API

假设它有很多方法,其中之一是 DELETE/api/foo/{id},它显然会使用给定的 从数据库中删除 foo 实体>id.

问题是由于数据库中的大数据,这个操作不是即时的,所以如果客户端尝试对同一个实体同时执行乘法删除操作,比如说

DELETE/api/foo/123 x N 次(当然是客户端软件的错误),

它会在数据库中造成一些令人不快的副作用(您知道,如果您尝试在多个事务中删除同一个实体,这通常不太好)。

我的问题是:Spring MVC 中防止此类情况的最佳实践是什么?

我当然可以在每个这样的更新方法 (PUT/DELETE) 中引入对 Foo id 的同步。我需要为所有实体和所有 PUT/DELETE API 方法执行此操作,但我真的不想这样做。我想这应该是一些优雅而漂亮的解决方案,如何在拦截器/servlet 级别(即不在 Controller 级别的服务上)执行此类同步。

我还可以创建特定的拦截器并在那里执行等待重复的请求(具有相同 URL 和参数的请求)。但同样,这听起来不是一个优雅的解决方案(直到我可以确保无法以某种方式以更美观的方式在 Spring MVC 中进行配置)。

最佳答案

这是一个并发问题,应该通过使用适当的事务和锁定级别来处理。不幸的是,这里没有适合所有方式的单一大小,根据您的实际要求,您可能必须实现乐观或悲观锁定,以及一种可能的事务级别(从根本没有事务到可序列化事务)。

一般来说,在 web 级别处理此类问题不是一个好主意,因为您最终会遇到这样的问题,例如根据请求要做什么要删除另一个正在同时显示的一些数据?在SpringMVC中,常见的方式是在服务层使用事务方法。此外,您应该在持久层中声明乐观或悲观锁定系统。

乐观层通常以某些事务以异常结束为代价提供更高的吞吐量。在这种情况下,当前的最佳做法是向用户报告问题,要求他/她再次发送他/她的请求。

关于java - 防止 REST 客户端同时执行具有相同参数的相同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43180698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com