【问题标题】:detect duplicate insert检测重复插入
【发布时间】:2009-11-03 22:21:55
【问题描述】:

有没有更简单的方法来防止刷新后重复插入?我现在的做法是选择除 ID 之外的所有字段作为参数的所有内容;如果存在记录,我不插入。有没有办法检测刷新?

【问题讨论】:

    标签: c# .net asp.net vb.net visual-studio


    【解决方案1】:

    假设它是一个数据库,您可以对“除 ID 之外的所有字段”的组合设置唯一约束,并在插入或更新时捕获异常。

    【讨论】:

    • 我非常喜欢这个。明天早上我会尝试的第一件事。
    • 这里的同事都不敢尝试这个。他们不喜欢篡改数据库。
    • 你也可以在你的 DataSet 上放一个 Key 来做这个。
    【解决方案2】:

    我同意@Austin Salonen 的观点,您应该首先使用主键、唯一约束和外键来保护数据库。

    完成后,许多网站将在提交按钮后面包含一些 JS,以在发送请求之前立即禁用该按钮。这样,双击的用户就不会发送两个请求了。

    【讨论】:

    • JS 技巧非常适合减少服务器上的负载,但它不会保护您。关闭了JS,甚至恶意提交多个请求的用户怎么办?
    • @rmeador - 同意。没有数据库保护就没有真正的解决方案。 JS技术只能被认为是为用户提供方便。
    【解决方案3】:

    我想你可能想要 EXISTS 函数。 这是我通过google找到的EXISTS的简单解释。

    【讨论】:

    • 我喜欢这种方式。但是,如果我比较空值怎么办?因为我会说 = null 并且没有什么可以是 = null 但它可以是 isNull。
    • 您可以尝试在可能为空的字段的查询中添加一些类似“IS NOT NULL”的内容。没有看到查询示例就很难确定。
    【解决方案4】:

    就像 Dereleased 所说,使用基于 303 的重定向。使表单提交使用 POST,然后在保存后发送一个 303 标头并通过 Location 标头将它们发送到提交后 URL,该标头将通过 GET 获取,并且刷新不会重新发布数据。

    【讨论】:

      【解决方案5】:

      我已经很久没有做任何真正的网络工作了。但在 1.1 天,我记得使用与回发关联的 id 来确定是否发生了刷新。

      经过快速搜索,我认为这是我基于以下解决方案的文章:

      http://msdn.microsoft.com/en-us/library/ms379557(VS.80).aspx

      它基本上向您展示了如何构建一个可以继承的新页面类。基类将公开一个您在执行不应在刷新时重复的操作时调用的方法,以及一个 IsPageRefresh 方法来跟踪是否发生了刷新。

      那篇文章是许多具有相似目标的变体的基础,所以它应该是一个很好的起点。不幸的是,我记不清它是如何真正提供更多帮助的。

      【讨论】:

        【解决方案6】:

        在提交请求(插入数据库的记录)后,我支持将用户重定向到另一个(确认)页面的选项。这样他们将无法进行刷新。

        您还可以有一个标志来指示插入请求是否已提交,并将其存储在页面(使用 javascript)或会话中。您还可以更进一步并将其存储在其他地方,但这是您的 Web 应用程序的架构决定。

        如果您使用 AJAX 请求来插入记录,那么在客户端阻止这种情况会有点困难。

        我宁愿做一个指标/标志然后比较字段。当然,这取决于您的记录。例如,如果它是一个简单的商店,并且用户想要下一个相同的订单,那么您会将其视为重复订单并有效地阻止该功能。

        【讨论】:

          【解决方案7】:

          你用的是什么数据库?如果它是 MySQL,并且您的实现的某些其他因素保持一致,您可以始终使用 INSERT IGNORE INTO ... 编辑:Struck for SQL Server

          或者,您可以创建“处理程序”页面,例如您的流程如下所示:

          1. 用户尝试执行“操作”
          2. 用户被发送到“doAction.xxx”
          3. “doAction.xxx”完成,并重定向到“actionDone.xxx”
          4. ???
          5. 利润!

          编辑:重新阅读您的问题后,我将更倾向于第二种解决方案;通过创建带有重定向的中间页面(通常是HTTP/1.1 303 See Other),您通常可以防止这种混淆。检查数据库的唯一性总是一个好主意,但对于不希望刷新重复上一个操作的简单情况,这是一个优雅且成熟的解决方案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-27
            • 2011-12-04
            • 1970-01-01
            • 2016-10-18
            • 2011-12-26
            • 2017-01-12
            • 2014-10-04
            相关资源
            最近更新 更多