在阅读了很多文章和许多与上述主题相关的答案后,我仍然想知道SQL Server数据库引擎如何在以下示例中工作:
我们假设我们有一个名为t3的表:
create table t3 (a int , b int);
create index test on t3 (a);
Run Code Online (Sandbox Code Playgroud)
和查询如下:
INSERT INTO T3
SELECT -86,-86
WHERE NOT EXISTS (SELECT 1 FROM t3 where t3.a=-86);
Run Code Online (Sandbox Code Playgroud)
在根据列"a"验证该行尚不存在之后,查询在表t3中插入一行.
许多文章和答案表明使用上述查询无法将行插入两次.
为了执行上面的查询,我假设数据库引擎的工作原理如下:
现在考虑以下场景:
我错过了什么吗?上述方法是避免重复输入的正确方法吗?
避免重复输入的安全方法是使用下面的代码,但我只是想知道上述方法是否正确.
begin tran
if (SELECT 1 FROM t3 with (updlock) where t3.a=-86)
begin
INSERT INTO T3
SELECT -86,-86
end
commit
Run Code Online (Sandbox Code Playgroud)