Tsql 我需要什么隔离级别来确保跨数据库插入…选择以原子方式进行?
我有一个驱动第二个表内容的源表。我将为此运行两个或多个进程(对where子句进行了不同的添加)。基本上都使用下面的语句。不知怎的,我在目的地表中得到了重复项。我目前没有指定隔离级别或任何锁定提示。SQL Server正在运行2005,这是我无法更改的(我知道2008的Tsql 我需要什么隔离级别来确保跨数据库插入…选择以原子方式进行?,tsql,sql-server-2005,locking,atomic,Tsql,Sql Server 2005,Locking,Atomic,我有一个驱动第二个表内容的源表。我将为此运行两个或多个进程(对where子句进行了不同的添加)。基本上都使用下面的语句。不知怎的,我在目的地表中得到了重复项。我目前没有指定隔离级别或任何锁定提示。SQL Server正在运行2005,这是我无法更改的(我知道2008的MERGE可能适用) 这两个表位于不同的数据库中。这两个数据库都位于同一服务器上的同一实例上,因此这样的跨数据库语句是可能的 我需要什么样的隔离级别或锁定提示才能使它以原子方式工作,从而防止重复?我需要在事务中包装它吗 INSERT
MERGE
可能适用)
这两个表位于不同的数据库中。这两个数据库都位于同一服务器上的同一实例上,因此这样的跨数据库语句是可能的
我需要什么样的隔离级别或锁定提示才能使它以原子方式工作,从而防止重复?我需要在事务中包装它吗
INSERT INTO tableDst
(PK, ...)
SELECT src.PK, ...
FROM tableSrc src WITH (UPDLOCK, HOLDLOCK)
LEFT JOIN tableDst dst ON src.PK = dst.PK
WHERE dst.PK IS NULL
这相当于可序列化,它将阻止对源表选定行的读取
在不了解您的精确场景和测试的情况下,无法确定您是否还需要:
INSERT INTO tableDst
(PK, ...)
SELECT src.PK, ...
FROM tableSrc src WITH (UPDLOCK, HOLDLOCK)
LEFT JOIN tableDst dst WITH (UPDLOCK, HOLDLOCK) ON src.PK = dst.PK
WHERE dst.PK IS NULL
INSERT INTO tableDst
(PK, ...)
SELECT src.PK, ...
FROM tableSrc src WITH (UPDLOCK, HOLDLOCK)
LEFT JOIN tableDst dst WITH (UPDLOCK, HOLDLOCK) ON src.PK = dst.PK
WHERE dst.PK IS NULL