2

我的案例场景将参数传递给一个过程,该过程只进行插入。但是两个线程可能会尝试传递相同的值。

如何处理这种情况而不会抛出异常并使用最少的锁?

我的性能要求是每秒至少 10k 次插入。

编辑:列是唯一的。时间戳可能会在插入之前更改(调整)。

4

3 回答 3

3

使用忽略重复键选项在表上创建索引。它不会插入重复的行,也不会出现任何错误。

例如

create unique index i1 on #tmp(id) with ignore_dup_key

insert into #tmp values(1,"A")
2> go
(1 row affected)


1> insert into #tmp values(1,"A")
2> go
Duplicate key was ignored.
(0 rows affected)
于 2011-09-12T11:05:03.347 回答
2

试试MERGE语句

来自 MSDN 。一种常见的情况是,如果存在匹配行,则更新表中的一个或多个列,或者如果匹配行不存在,则将数据作为新行插入。这通常通过将参数传递给包含适当 UPDATE 和 INSERT 语句的存储过程来完成。使用 MERGE 语句,您可以在单个语句中执行这两项任务。

关于您的性能问题,还有一个关于优化 MERGE 语句性能的页面

于 2011-09-12T10:05:29.663 回答
2

正如@Martin Smith指出的那样,有一个很好的解决方案——尽管它与我的问题相反,但它背后有很好的理由,似乎得到了很好的支持。您可以在这里找到 @gbn发布的原始答案。

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

说真的,这是最快和最并发的,没有锁,尤其是在大容量时。如果升级了 UPDLOCK 并且整个表都被锁定了怎么办?

您可以在此处找到 Paul Nielsen 的原文。- 第 4 课。

如果有人和我有类似的问题,最好看看它。

于 2011-09-13T09:29:01.727 回答