Php 双重请求导致双重插入
我们有一个SPA应用程序,流量很大,有时会在应用程序的几个部分插入双行 例如用户注册。通常情况下,验证机制会检查电子邮件地址是否已经存在,但是我可以通过使用axios两次发送相同的请求来重现问题,从而导致数据库中的用户数量增加了一倍 我最初认为第二个请求应该抛出验证错误,但显然它太快了,在第一个请求能够存储它之前检查用户 所以我在这些请求之间设置了500毫秒的延迟,是的,它成功了,第二个请求抛出了一个验证错误 我的问题是,如果两个请求已经在同一瞬间发出,有什么技术可以防止双重插入Php 双重请求导致双重插入,php,symfony,axios,single-page-application,Php,Symfony,Axios,Single Page Application,我们有一个SPA应用程序,流量很大,有时会在应用程序的几个部分插入双行 例如用户注册。通常情况下,验证机制会检查电子邮件地址是否已经存在,但是我可以通过使用axios两次发送相同的请求来重现问题,从而导致数据库中的用户数量增加了一倍 我最初认为第二个请求应该抛出验证错误,但显然它太快了,在第一个请求能够存储它之前检查用户 所以我在这些请求之间设置了500毫秒的延迟,是的,它成功了,第二个请求抛出了一个验证错误 我的问题是,如果两个请求已经在同一瞬间发出,有什么技术可以防止双重插入 当然,我们在发
当然,我们在发出第一个请求后就阻止了“提交表单”按钮(从一开始),但人们还是设法发送了两次请求。我过去使用的一个选项是数据库锁定。我对此有点生疏,但就你而言:
编辑:我还应该注意,使用数据库锁会有额外的性能问题。我过去使用过的一个选项是数据库锁。我对此有点生疏,但就你而言:
编辑:我还应该注意,使用数据库锁会有额外的性能问题。您研究过条令的并发性吗?在表中添加
UNIQUE
约束是否仍然允许双重插入?您是否研究了条令的并发性?在表中添加UNIQUE
约束是否仍然允许双重插入?是的,您的回答和@diabeticnephropathy的注释解释了数据库相关的问题。但是,如果控制器不处理数据库连接,而是处理一些业务逻辑,该怎么办?@undefinedman公平地说,这是您的问题,如何防止在数据库中重复插入。尤其是Symfony还有其他不处理数据库的功能。你可以尝试重新构造你的应用程序,使你的操作是幂等的。但是没有简单的答案,这取决于过程。文档@diabeticnephropathy linked确实列出了一些可以放在控制器中的代码。但是,根据数据库使用的供应商以及其他业务逻辑的运行方式,可能需要在多个应用程序层上执行解决方案(例如,如上所述,在电子邮件上强制执行唯一的解决方案)。是的,您的回答和@Diabetic Nephropathy的注释解释了与数据库相关的问题。但是,如果控制器不处理数据库连接,而是处理一些业务逻辑,该怎么办?@undefinedman公平地说,这是您的问题,如何防止在数据库中重复插入。尤其是Symfony还有其他不处理数据库的功能。你可以尝试重新构造你的应用程序,使你的操作是幂等的。但是没有简单的答案,这取决于过程。文档@diabeticnephropathy linked确实列出了一些可以放在控制器中的代码。但是,根据数据库使用的供应商以及其他业务逻辑的运行方式,可能需要在多个应用程序层上执行解决方案(例如,如上所述,在电子邮件上强制使用唯一的解决方案)。