是否可以对SQL Server中的表执行显式共享锁?
我需要做以下事情:
基本上,我想确保没有任何内容添加到表中,而我正在对临时表执行操作,但我仍然希望它可读。
由于某种原因,将整个事物放在一个事务中会导致我对临时表执行的某些操作出现死锁,因此这不是一个选项。
答案 0 :(得分:3)
保持表锁的唯一方法是保持事务处于打开状态。所以我们可能需要更多关于这个“我在临时表中做的一些事情的死锁”的信息。
根据任务的不同,临时表可能根本不是必需的 - 听起来你正在构建一种程序性思维而不是基于集合的思维模式。
您概述的基本草图将是:
/* Create temp table here */
BEGIN TRANSACTION
INSERT INTO #Table (/* Columns */)
SELECT /* Columns */ FROM SourceTable WITH (UPDLOCK,HOLDLOCK)
/* Work within temp table here */
UPDATE st
SET
/* Set new column values based on temp table */
FROM
SourceTable st
inner join
#Table t
on
/* Key column join here */
COMMIT
你需要指定UPDATE锁而不是共享锁,这实际上是“现在共享锁,但我打算稍后在同一个事务中独占”,以防止可能的死锁。