Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.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
Php 双重请求导致双重插入_Php_Symfony_Axios_Single Page Application - Fatal编程技术网

Php 双重请求导致双重插入

Php 双重请求导致双重插入,php,symfony,axios,single-page-application,Php,Symfony,Axios,Single Page Application,我们有一个SPA应用程序,流量很大,有时会在应用程序的几个部分插入双行 例如用户注册。通常情况下,验证机制会检查电子邮件地址是否已经存在,但是我可以通过使用axios两次发送相同的请求来重现问题,从而导致数据库中的用户数量增加了一倍 我最初认为第二个请求应该抛出验证错误,但显然它太快了,在第一个请求能够存储它之前检查用户 所以我在这些请求之间设置了500毫秒的延迟,是的,它成功了,第二个请求抛出了一个验证错误 我的问题是,如果两个请求已经在同一瞬间发出,有什么技术可以防止双重插入 当然,我们在发

我们有一个SPA应用程序,流量很大,有时会在应用程序的几个部分插入双行

例如用户注册。通常情况下,验证机制会检查电子邮件地址是否已经存在,但是我可以通过使用axios两次发送相同的请求来重现问题,从而导致数据库中的用户数量增加了一倍

我最初认为第二个请求应该抛出验证错误,但显然它太快了,在第一个请求能够存储它之前检查用户

所以我在这些请求之间设置了500毫秒的延迟,是的,它成功了,第二个请求抛出了一个验证错误

我的问题是,如果两个请求已经在同一瞬间发出,有什么技术可以防止双重插入


当然,我们在发出第一个请求后就阻止了“提交表单”按钮(从一开始),但人们还是设法发送了两次请求。

我过去使用的一个选项是数据库锁定。我对此有点生疏,但就你而言:

  • 请求表的写锁
  • 在表上运行SELECT以查找用户
  • 在表上运行INSERT
  • 释放写锁
  • 这将使您更好地了解什么锁适用于什么影响。注意:某些数据库系统可能以不同的方式实现锁


    编辑:我还应该注意,使用数据库锁会有额外的性能问题。

    我过去使用过的一个选项是数据库锁。我对此有点生疏,但就你而言:

  • 请求表的写锁
  • 在表上运行SELECT以查找用户
  • 在表上运行INSERT
  • 释放写锁
  • 这将使您更好地了解什么锁适用于什么影响。注意:某些数据库系统可能以不同的方式实现锁


    编辑:我还应该注意,使用数据库锁会有额外的性能问题。

    您研究过条令的并发性吗?在表中添加
    UNIQUE
    约束是否仍然允许双重插入?您是否研究了条令的并发性?在表中添加
    UNIQUE
    约束是否仍然允许双重插入?是的,您的回答和@diabeticnephropathy的注释解释了数据库相关的问题。但是,如果控制器不处理数据库连接,而是处理一些业务逻辑,该怎么办?@undefinedman公平地说,这是您的问题,如何防止在数据库中重复插入。尤其是Symfony还有其他不处理数据库的功能。你可以尝试重新构造你的应用程序,使你的操作是幂等的。但是没有简单的答案,这取决于过程。文档@diabeticnephropathy linked确实列出了一些可以放在控制器中的代码。但是,根据数据库使用的供应商以及其他业务逻辑的运行方式,可能需要在多个应用程序层上执行解决方案(例如,如上所述,在电子邮件上强制执行唯一的解决方案)。是的,您的回答和@Diabetic Nephropathy的注释解释了与数据库相关的问题。但是,如果控制器不处理数据库连接,而是处理一些业务逻辑,该怎么办?@undefinedman公平地说,这是您的问题,如何防止在数据库中重复插入。尤其是Symfony还有其他不处理数据库的功能。你可以尝试重新构造你的应用程序,使你的操作是幂等的。但是没有简单的答案,这取决于过程。文档@diabeticnephropathy linked确实列出了一些可以放在控制器中的代码。但是,根据数据库使用的供应商以及其他业务逻辑的运行方式,可能需要在多个应用程序层上执行解决方案(例如,如上所述,在电子邮件上强制使用唯一的解决方案)。