Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 我需要什么隔离级别来确保跨数据库插入…选择以原子方式进行?_Tsql_Sql Server 2005_Locking_Atomic - Fatal编程技术网

Tsql 我需要什么隔离级别来确保跨数据库插入…选择以原子方式进行?

Tsql 我需要什么隔离级别来确保跨数据库插入…选择以原子方式进行?,tsql,sql-server-2005,locking,atomic,Tsql,Sql Server 2005,Locking,Atomic,我有一个驱动第二个表内容的源表。我将为此运行两个或多个进程(对where子句进行了不同的添加)。基本上都使用下面的语句。不知怎的,我在目的地表中得到了重复项。我目前没有指定隔离级别或任何锁定提示。SQL Server正在运行2005,这是我无法更改的(我知道2008的MERGE可能适用) 这两个表位于不同的数据库中。这两个数据库都位于同一服务器上的同一实例上,因此这样的跨数据库语句是可能的 我需要什么样的隔离级别或锁定提示才能使它以原子方式工作,从而防止重复?我需要在事务中包装它吗 INSERT

我有一个驱动第二个表内容的源表。我将为此运行两个或多个进程(对where子句进行了不同的添加)。基本上都使用下面的语句。不知怎的,我在目的地表中得到了重复项。我目前没有指定隔离级别或任何锁定提示。SQL Server正在运行2005,这是我无法更改的(我知道2008的
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