我有一个设计模式,我一直在努力防止重复发布数据。
以下是步骤:
以下是场景: 客户端使用guid“1”提交数据,然后在执行原始数据提交的步骤(5)之前使用guid“1”重新提交数据,然后将事务处理两次。
在不使用信号量或阻塞的情况下防止这种情况的最佳设计模式是什么?如果由于某种原因(服务器端的硬件问题等)第一次提交失败,用户应该能够重新提交。
谢谢!
答案 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,即
注意 - 此方法仅在此表保持亮(不超过1M记录)且选择和删除快速工作时才有效。您也可以索引GUID列。