【问题标题】:Double requests causing double inserts双重请求导致双重插入
【发布时间】:2020-10-15 17:57:04
【问题描述】:

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

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

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

所以我在这些请求之间设置了 500 毫秒的延迟,是的,它起作用了,第二个请求引发了验证错误。

我的问题是,如果两个请求已经在同一秒内分派,有哪些技术可以防止双重插入?

当然,在发出第一个请求后,我们已经阻止了提交表单按钮(从一开始),但人们不知何故设法分派了两次请求。

【问题讨论】:

标签: php symfony axios single-page-application


【解决方案1】:

我过去使用的一个选项是数据库锁定。我对此有点生疏,但在你的情况下:

  1. 为表请求 WRITE LOCK
  2. 对表运行 SELECT 以查找用户。
  3. 在表上运行 INSERT。
  4. 释放写锁。

post on DB locking 应该让您更好地了解哪些锁应用了哪些影响。注意:某些数据库系统可能会以不同的方式实现锁。

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

【讨论】:

  • 是的,您的回答和@Diabetic Nephropathy 的评论解释了与数据库相关的问题。但是,如果控制器不处理数据库连接而是处理一些业务逻辑呢?
  • @undefinedman 公平地说,这是你的问题,如何防止数据库中的双重插入。 Symfony 尤其有其他不处理数据库的locking mechanisms。您可以尝试重新架构您的应用程序,以便您的操作是幂等的。但没有简单的答案,这将取决于过程。
  • 链接的文档@糖尿病肾病确实概述了一些可以放置在控制器中的代码。但是,根据数据库使用的供应商以及其他业务逻辑的运行方式,可能需要在多个应用层执行解决方案(例如,如上所述,在电子邮件上强制使用 UNIQUE)。
猜你喜欢
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
相关资源
最近更新 更多