0

我尝试将一些行加载到目标表中,但前提是它们尚不存在。一个经典的左连接查询解决了这个问题:

    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:不幸的是,我不允许更改数据库隔离级别。

4

1 回答 1

0

表提示 READCOMMITEDLOCK 是答案,但仍有一些问题,将发布另一个关于它的问题。

于 2020-03-06T14:35:30.913 回答