防止重复提交的最佳设计模式是什么?

时间:2010-10-17 03:17:47

标签: database design-patterns transactions

我有一个设计模式,我一直在努力防止重复发布数据。

以下是步骤:

  1. 客户端使用唯一的guid(客户端生成的guid - 保证唯一)提交数据
  2. 服务器端软件确保客户端guid在DB
  3. 中尚不存在
  4. 开始交易
  5. 过程数据(可能需要1-20秒,具体取决于有效负载)
  6. 提交交易
  7. 以下是场景: 客户端使用guid“1”提交数据,然后在执行原始数据提交的步骤(5)之前使用guid“1”重新提交数据,然后将事务处理两次。

    在不使用信号量或阻塞的情况下防止这种情况的最佳设计模式是什么?如果由于某种原因(服务器端的硬件问题等)第一次提交失败,用户应该能够重新提交。

    谢谢!

5 个答案:

答案 0 :(得分:1)

您可以使用读取未提交数据的查询来实现步骤2。例如,如果您使用的是MS SQL Server,则可以执行以下操作:

IF NOT EXIST(SELECT * FROM SomeTable (NOLOCK) WHERE Guid = @ClienGUID)
BEGIN
   -- Insert the GUID ASAP in the transaction so that the next query will read it
   -- Do steps 3-5
END

这里的关键是(NOLOCK)提示,它读取未提交的数据

答案 1 :(得分:1)

将GUID存储在具有SQL UNIQUE约束的列中。

当您尝试(在事务中)插入第二个重复的GUID时,操作将失败,此时您将回滚整个事务。

答案 2 :(得分:0)

我不知道您使用什么来开发前端,但在Web应用程序中,您可以使用ajax检查服务器转换状态,在等待时为用户提供一些反馈,同时禁用提交选项。

答案 3 :(得分:0)

您可以散列用户提供的数据并将其存储在表格中 - 在继续之前检查散列是否与之前的提交内容不匹配?

答案 4 :(得分:0)

创建一个表running_transactions,其中存储当前正在运行的事务的GUID,即

  1. 在running_transactions中保存GUID。
  2. 如果GUID存在与否,服务器端软件会在此表中检查,如果是,则响应是“正在处理的事务”。
  3. 服务器端软件在DB中检查重复的GUID。如果存在,则回复是重复的交易'。
  4. 如果成功来自2& 3,然后开始交易并完成它。在此期间,如果请求在comit发生之前再次使用相同的GUID,则会在步骤2中捕获。 5.完成事务后,从running_transactions表中删除GUID。
  5. 注意 - 此方法仅在此表保持亮(不超过1M记录)且选择和删除快速工作时才有效。您也可以索引GUID列。