【发布时间】:2017-08-03 12:42:49
【问题描述】:
我不确定我是否在标题中用了正确的词来解释。但它就在这里。
应用:Coldfusion/MySQL
在第一个请求完成之前触发双重请求的不良互联网接收期间异常发生问题。结果生成了两个数据库条目。
应用程序只处理带有 SELECT 查询的双重请求,以检查数据库中是否已经存在相同的记录。在这种情况下,旧记录将使用 UPDATE 语句进行更新。否则,使用 INSERT 语句插入新记录。 SELECT/INSERT/UPDATE 包含在 CFTRANSACTION 中。
<cftransction>
<cfquery></cfquery> //SELECT
<cfif SELECT.found>
<cfquery></cfquery> //UPDATE
<cfelse>
<cfquery></cfquery> //INSERT
</cfif>
</cftransaction>
在大多数情况下,当两个请求有一些延迟时,它可以正常工作。要重现问题,
- 我首先尝试通过浏览器同时发起两个请求,但多次尝试都没有问题。
- 为了快速发出两个请求,我在页面上的一个之后使用了两个 post 语句(它是一个 AJAX 应用程序)。它也按预期工作,因为第二个请求仅更新先前输入的记录。
- 我可以做些什么来更快地完成这两个请求,我在服务器本身(ColdFusion 和 MySQL 都在其中运行)并打开了浏览器。现在,一个带有两个 post 语句的浏览器请求开始频繁重复输入。
当 REQUEST.2 SELECT 在 REQUEST.1 INSERT 之前运行时,上面的代码可能会插入两个条目。服务器端有什么可能的解决方案?
在第一个请求完成之前禁用后续请求,在客户端进行处理。但想在服务器上保护它。
【问题讨论】:
-
对于插入查询,你使用的是
values吗? -
您是否查看了诸如REPLACE 或INSERT ... ON DUPLICATE KEY UPDATE 之类的db 选项,而不是SELECT .. INSERT 方法?
-
@DanBracuk 是的,我正在使用 INSERT INTO (col1, col2) 值 ('val1','val2') 首先使用 SELECT 查询检查相同的值。
-
@Leigh 我也会检查这些方法,然后回来。谢谢。
-
您可以使用
select etc where not exists (something)方法,而不是values方法。
标签: mysql coldfusion insert duplicates