【问题标题】:How to avoid duplicated records in a multi-thread application? [duplicate]如何避免多线程应用程序中的重复记录? [复制]
【发布时间】:2014-06-14 15:13:22
【问题描述】:

我有多个线程生成数据并将它们存储到数据库中。生成的数据可能会被复制。我不想在数据库中重复。我目前的解决方案是在 C# 代码中使用锁来强制多个线程同步写入 DB。即每个线程检查其数据是否已存在于数据库中并仅存储新数据。但这似乎损害了性能。有没有更好的解决方案?也许让数据库来处理重复?

我使用的是 SQL Sever 2008 R2。

【问题讨论】:

  • 你不是第一个遇到这个问题的人。请参阅google.com/… 了解大量策略。

标签: sql-server multithreading sql-server-2008-r2


【解决方案1】:

您可以使用唯一索引和约束来防止数据库中的重复。您可以在复制发生时处理异常。

【讨论】:

  • 我尝试添加唯一约束。但是该列的长度为 2000,超过了索引列的 900 限制。
  • 您可以创建唯一约束而不是索引。您也可以将长列拆分为许多短列
【解决方案2】:

如果存在标识每一行的唯一键,则可以在表上放置唯一约束以防止重复。它使用索引来检查唯一性,因此它应该是有效的。

此外,SQLServer 可以向客户端应用程序中的 C# 代码返回一条错误消息,让他们知道违反了约束。

根据附加信息进行编辑: -- 如果您的唯一列超过 900 个字节,请尝试基于触发器的解决方案或唯一列的 MD5(仅 64 个字节),并基于 MD5 列创建唯一约束。您可以使用计算列来实现此目的。

    ALTER TABLE dbo.LookupValues ADD bigColumnhash AS
    HASHBYTES('SHA2_512', bigColumn) PERSISTED;
    GO


    CREATE UNIQUE NONCLUSTERED INDEX ix_LookupValues_bigColumnhash
    on dbo.LookupValues (bigColumnhash) INCLUDE (bigColumn);
    GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2021-11-02
    • 2017-08-15
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多