我的案例场景将参数传递给一个过程,该过程只进行插入。但是两个线程可能会尝试传递相同的值。
如何处理这种情况而不会抛出异常并使用最少的锁?
我的性能要求是每秒至少 10k 次插入。
编辑:列是唯一的。时间戳可能会在插入之前更改(调整)。
我的案例场景将参数传递给一个过程,该过程只进行插入。但是两个线程可能会尝试传递相同的值。
如何处理这种情况而不会抛出异常并使用最少的锁?
我的性能要求是每秒至少 10k 次插入。
编辑:列是唯一的。时间戳可能会在插入之前更改(调整)。
使用忽略重复键选项在表上创建索引。它不会插入重复的行,也不会出现任何错误。
例如
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)
试试MERGE语句
来自 MSDN 。一种常见的情况是,如果存在匹配行,则更新表中的一个或多个列,或者如果匹配行不存在,则将数据作为新行插入。这通常通过将参数传递给包含适当 UPDATE 和 INSERT 语句的存储过程来完成。使用 MERGE 语句,您可以在单个语句中执行这两项任务。
关于您的性能问题,还有一个关于优化 MERGE 语句性能的页面
正如@Martin Smith指出的那样,有一个很好的解决方案——尽管它与我的问题相反,但它背后有很好的理由,似乎得到了很好的支持。您可以在这里找到 @gbn发布的原始答案。
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
说真的,这是最快和最并发的,没有锁,尤其是在大容量时。如果升级了 UPDLOCK 并且整个表都被锁定了怎么办?
您可以在此处找到 Paul Nielsen 的原文。- 第 4 课。
如果有人和我有类似的问题,最好看看它。