0

如果表中还没有记录,那么将记录插入到表中的更好技术是什么?

问题是代码检查具有条件的记录是否存在,如果不存在,它会创建一个。但是,第二个线程可能会同时出现并检查。

我们开始尝试 TABLOCKX,它最初有效,虽然感觉有点像使用大象枪,但我们也在考虑使用快照隔离,它在这种情况下不起作用,第二个事务可以出现并读取桌子。

这是一个常见的问题,所以似乎应该有一个更标准的解决方案。请注意,此处不适合使用唯一索引,因为正在搜索的字段可能包含空值,并且 SQL Server 2005 不支持该上下文中的唯一约束。

4

2 回答 2

1

我在原始问题中没有看到任何关于更新表格的内容,所以也许你只想要类似的东西:

INSERT mytable (c1, c2, c3)
SELECT v1, v2, v3
WHERE NOT EXISTS (SELECT 1 FROM mytable WITH (UPDLOCK) WHERE c1=v1 AND c2=v2 AND c3=v3)
于 2012-07-26T21:46:44.037 回答
0

在 SQL 2008 内部,我建议使用 Merge;但是,您标记了 2005。因此,对于 MS SQL 2005,您最好的选择是使用事务:

我会使用这样的东西:

begin tran
   update table with (x) set ...
   where key = @key

   if @@rowcount = 0
   begin
          insert table (key, ...) values (@key,..)
   end
commit tran
于 2012-07-26T16:01:59.427 回答