我尝试将一些行加载到目标表中,但前提是它们尚不存在。一个经典的左连接查询解决了这个问题:
INSERT INTO dbo.Target(SomeData)
SELECT DISTINCT SomeData
FROM #Temp s
LEFT JOIN dbo.Target d ON d.SomeData = s.SomeData
WHERE d.SomeData IS NULL;
此插入从不同用户并行运行多次,这些用户大部分时间都尝试插入相同的数据。
我看到来自不同用户的表中有很多重复项(SomeData 列上还没有唯一约束),这很奇怪,因为左连接应该检测到这一点并防止插入已经在表中的数据。
我调查并看到数据库处于 RCSI(读取提交的快照隔离)级别。我的想法是所有并行会话都认为他们是第一个插入数据的,并且都成功地做到了。
我怎么能在 RCSI 下插入呢?如果有一个会话已经在执行其左连接插入内容,我希望每个会话都等待。
任何帮助表示赞赏,谢谢!PS:不幸的是,我不允许更改数据库隔离级别。