繁体   English   中英

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

[英]What is the best design pattern for preventing duplicate submissions?

我一直在努力解决如何最好地防止重复发布数据的设计模式。

步骤如下:

  1. 客户使用唯一的GUID提交数据(客户生成的GUID-保证唯一)
  2. 服务器端软件可确保客户端guid在数据库中尚不存在
  3. 开始交易
  4. 处理数据(可能需要1-20秒,具体取决于有效负载)
  5. 提交交易

这里是场景:客户提交的GUID为“ 1”的数据,然后在步骤(5)被命中原始数据提交之前,重新提交GUID为“ 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)提示,它读取未提交的数据

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

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

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

您可以对用户提供的数据进行哈希处理并将其存储在表中吗?在继续操作之前,请检查哈希与先前提交的数据是否匹配?

制作一个表running_transactions,用于存储当前正在运行的事务的GUID,即

  1. 将GUID保存在running_transactions中。
  2. 服务器端软件在此表中检查GUID是否存在,如果存在,则响应为“正在处理事务”。
  3. 服务器端软件在DB中检查是否有重复的GUID。 如果存在,则响应为“重复交易”。
  4. 如果2和3成功,则开始交易并完成交易。 在此期间,如果在提交之前再次使用相同的GUID发出请求,则将在步骤2中捕获该请求。5.事务完成后,从running_transactions表中删除该GUID。

注意-仅当此表保持明亮(不超过1M条记录)并且选择和删除有效时,此方法才有效。 您也可以索引GUID列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM