Sql server Coldfusion在表单提交时会出现间歇性重复!!即使是删除和更新

Sql server Coldfusion在表单提交时会出现间歇性重复!!即使是删除和更新,sql-server,forms,coldfusion,Sql Server,Forms,Coldfusion,我已经为此工作了6个小时了……我一点也不知道出了什么问题。我有一个购物车,每种商品都有表单变量来更新数量。无论出于何种原因,ColdFusion将完全随机地插入两条用于表单更新的记录。我甚至删除了更新,并在insert语句的正上方放置了一个DELETE ALL WHERE查询,以确保数据库中的所有内容都已清除,不走运。下面是我还原为update语句的代码: <cfquery datasource="something" result="UpdateProdRecordBase"> U

我已经为此工作了6个小时了……我一点也不知道出了什么问题。我有一个购物车,每种商品都有表单变量来更新数量。无论出于何种原因,ColdFusion将完全随机地插入两条用于表单更新的记录。我甚至删除了更新,并在insert语句的正上方放置了一个DELETE ALL WHERE查询,以确保数据库中的所有内容都已清除,不走运。下面是我还原为update语句的代码:

<cfquery datasource="something" result="UpdateProdRecordBase">
Update dbo.CS
SET dbo.CS.Quantity = <cfqueryparam value="#form['base#ConfigurationList.The_Product_ID#group#CurrentProductReceiveGroup#']#" cfsqltype="cf_sql_numeric">
WHERE
dbo.CS.The_Product_ID = <cfqueryparam cfsqltype="cf_sql_numeric" value="#ConfigurationList.The_Product_ID#">
AND dbo.CS.The_TRequestSubSet_ID = <cfqueryparam cfsqltype="cf_sql_numeric" value="#TRSS#"> 
AND dbo.CS.ConfigType = 1 
AND dbo.CS.Group = <cfqueryparam value="#CurrentProductReceiveGroup#" cfsqltype="cf_sql_numeric"> 
AND dbo.CS.The_ParentProduct_ID = 0
</cfquery>


<cfif (isdefined("UpdateProdRecordBase.recordcount") AND UpdateProdRecordBase.recordcount EQ 0) OR (not isdefined("UpdateProdRecordBase.recordcount"))>

同样,这些都是背对背的查询…99.9%的时间它工作得很完美。另一个。1%的时间,它将复制条目。这在逻辑上是不一致的。我过去也删除了更新脚本,并在插入查询上方添加了删除查询。同样的运气

为了一致性起见,我对同一产品组合进行了多次测试。您选择的产品,一次,工作完美。再次选择相同的产品组合时,将插入一个副本

有什么想法吗?现在我完全没有选择了。我在这个过程中输出了查询,没有明显的项目导致这种情况发生,数据完全相同。

我发现在我的所有插入之前添加一个if not exists可以防止所有DUP由于各种原因发生,最常见的原因是用户将提交按钮lol捣乱。尝试以下方法:

 <cfquery>
    if not exists (select The_TRequestSubSet_ID 
        from  dbo.cs
        WHERE   The_TRequestSubSet_ID = <cfqueryparam value="#TRSS#" cfsqltype="cf_sql_numeric">
          AND   The_Product_ID = <cfqueryparam cfsqltype="cf_sql_numeric" value="#ConfigurationList.The_Product_ID#">
          AND   ConfigType = <cfqueryparam value="#form  ['base#ConfigurationList.The_Product_ID#group#CurrentProductReceiveGroup#']#" cfsqltype="cf_sql_numeric">
          AND   Group = <cfqueryparam value="#CurrentProductReceiveGroup#" cfsqltype="cf_sql_numeric">
                    )
    INSERT INTO dbo.CS(The_TRequestSubSet_ID , The_Product_ID, Quantity, ConfigType, Group)
    VALUES (<cfqueryparam value="#TRSS#" cfsqltype="cf_sql_numeric">, 
    <cfqueryparam cfsqltype="cf_sql_numeric" value="#ConfigurationList.The_Product_ID#">, 
    <cfqueryparam value="#form  ['base#ConfigurationList.The_Product_ID#group#CurrentProductReceiveGroup#']#" cfsqltype="cf_sql_numeric">, 
     1,<cfqueryparam value="#CurrentProductReceiveGroup#" cfsqltype="cf_sql_numeric">)
    </cfquery>
这告诉SQL仅在记录不存在时插入该记录。如果你真的想让事情变得更简单:

<cfquery>
if not exists (select The_TRequestSubSet_ID 
                from  dbo.cs
                WHERE   The_TRequestSubSet_ID = <cfqueryparam value="#TRSS#" cfsqltype="cf_sql_numeric">
                  AND   The_Product_ID = <cfqueryparam cfsqltype="cf_sql_numeric" value="#ConfigurationList.The_Product_ID#">
                  AND   ConfigType = <cfqueryparam value="#form  ['base#ConfigurationList.The_Product_ID#group#CurrentProductReceiveGroup#']#" cfsqltype="cf_sql_numeric">
                  AND   Group = <cfqueryparam value="#CurrentProductReceiveGroup#" cfsqltype="cf_sql_numeric">
                )
    begin
        INSERT INTO dbo.CS(The_TRequestSubSet_ID, The_Product_ID, Quantity, ConfigType, Group)
        VALUES (<cfqueryparam value="#TRSS#" cfsqltype="cf_sql_numeric">, 
        <cfqueryparam cfsqltype="cf_sql_numeric" value="#ConfigurationList.The_Product_ID#">, 
        <cfqueryparam value="#form  ['base#ConfigurationList.The_Product_ID#group#CurrentProductReceiveGroup#']#" cfsqltype="cf_sql_numeric">, 
         1,<cfqueryparam value="#CurrentProductReceiveGroup#" cfsqltype="cf_sql_numeric">)
    end
else 
    begin
        Update dbo.CS
        SET dbo.CS.Quantity = <cfqueryparam value="#form['base#ConfigurationList.The_Product_ID#group#CurrentProductReceiveGroup#']#" cfsqltype="cf_sql_numeric">
        WHERE
        dbo.CS.The_Product_ID = <cfqueryparam cfsqltype="cf_sql_numeric" value="#ConfigurationList.The_Product_ID#">
        AND dbo.CS.The_TRequestSubSet_ID = <cfqueryparam cfsqltype="cf_sql_numeric" value="#TRSS#"> 
        AND dbo.CS.ConfigType = 1 
        AND dbo.CS.Group = <cfqueryparam value="#CurrentProductReceiveGroup#" cfsqltype="cf_sql_numeric"> 
        AND dbo.CS.The_ParentProduct_ID = 0
    End
</cfquery>

现在,您有一个查询,如果不存在,将插入该查询;如果存在,将更新该查询。

您的页面可能提交了两次,正如其他人所说,http日志将确认这一点,但是正确处理两次帖子仍然很重要

我使用的一种策略是在会话中记录帖子,然后拒绝重复的帖子

发送页面:

<form ...>
   <input type="hidden" name="magicnumber" value="#CreateUUID()#">
</form>
接收页:

<cflock scope="session" type="exclusive">
  <cfif StructKeyExists(session.magicnumbers, form.magicnumber)>
    <cfset variables.isdup = true>
  <cfelse>
    <cfset session.magicnumbers[form.magicnumber] = true>
  </cfif>
</cflock>
<cfif !isdup>
...
</cfif>
然后我还将使用303标题重定向到另一个页面以显示任何内容

当然,您必须提前创建session.magicnumbers,例如OnSessionStart
如果您不使用用户会话,您可以使用应用程序或服务器作用域,但计划以某种方式写入旧值,这样您就不会慢慢消耗内存。

在黑暗中拍摄,但您的代码是否有可能驻留函数?这种零星的行为听起来像是由于缺乏适当的var范围而遇到的问题类型。顺便问一下,您在result属性上使用IsDefined有什么原因吗?它应该一直存在。您是否检查了http日志以查看该页面是否运行了两次?SQL Merge将是CleanerHanks@Lance,我希望这样做,但后来我出现了以下错误:[Macromedia][SQLServer JDBC Driver][SQLServer]违反主键约束“PK_uolms_Dat_uu9c04da075fa3f61”。无法在对象“dbo.OLMS_Data_TempRequests”中插入重复键。重复的键值为1005810264325。SQL:如果不存在,请从dbo.OLMS_Data_TempRequests中选择dbo.OLMS_Data_TempRequests.OLMS_TRequest_ID,其中dbo.OLMS_Data_TempRequests.OLMS_TRequest_ID=param 1。。。。呜呜呜呜。所以即使在插入了那个些不存在的东西之后,它仍然会抛出错误,说它不能插入@听起来好像有一个键被发送到insert语句。如果是这种情况,请将查询的If exists部分更改为只查看键值。如果不存在,请从表中选择key,其中key=@key insert else update我觉得这会引入竞争条件,除非您强制执行高隔离级别。谢谢Lance,我将进行更改,看看这是否稳定一点@TheCycoONE——你可能是对的……但是环境是高度隔离的,基于数据流的唯一因素应该是基于用户的,在这种情况下,执行糟糕的javascript。不幸的是,现有的体系结构不允许在数据库端生成UID,但我们正在尝试重建它。在此之前,左、右创可贴:。谢谢,先生们!这很有帮助!!我们当然也会考虑到这一点!我没有想过在会话中进行序列化存储。。。
<cflock scope="session" type="exclusive">
  <cfif StructKeyExists(session.magicnumbers, form.magicnumber)>
    <cfset variables.isdup = true>
  <cfelse>
    <cfset session.magicnumbers[form.magicnumber] = true>
  </cfif>
</cflock>
<cfif !isdup>
...
</cfif>