显式锁定SQL Server中的表?

时间:2011-03-03 07:41:08

标签: sql-server tsql transactions locking

是否可以对SQL Server中的表执行显式共享锁?

我需要做以下事情:

  • 共享锁表
  • 将表复制到临时表,以进行操作
  • 独家锁表
  • 将东西从tempTable复制到表格
  • 释放所有锁

基本上,我想确保没有任何内容添加到表中,而我正在对临时表执行操作,但我仍然希望它可读。

由于某种原因,将整个事物放在一个事务中会导致我对临时表执行的某些操作出现死锁,因此这不是一个选项。

1 个答案:

答案 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锁而不是共享锁,这实际上是“现在共享锁,但我打算稍后在同一个事务中独占”,以防止可能的死锁。