SQL Server 中的显式锁定表?

3

在SQL Server中,是否可以对表进行显式共享锁定?

我需要执行以下操作:

  • 对表进行共享锁定
  • 将表复制到临时表中进行操作
  • 对表进行排他锁定
  • 将临时表中的内容复制到表中
  • 释放所有锁定

基本上,我想确保在我对临时表进行操作时没有任何东西添加到表中,但我仍然希望能够读取它。

由于某些原因,将整个过程放入事务会导致一些我对临时表所做的操作死锁,因此这不是一个选项。


以上存在明显的死锁问题,如果两个“事物”同时尝试执行上述任务 - 即它们都具有共享锁,因此都无法获得独占锁。 - Damien_The_Unbeliever
问题是,即使在同一事务中运行整个过程,我仍然会遇到死锁。我将创建一个单独的问题来解决死锁问题,因为似乎我需要避免它,而不是试图绕过它。 - Joda
1个回答

4
唯一持有表锁的方法是保持事务处于打开状态。因此,我们可能需要更多关于“我在对临时表进行某些操作时遇到死锁”的信息。
根据任务的不同,临时表可能根本不需要 - 听起来你是从过程化思维方式而不是基于集合的思维方式构建东西。
你所概述的基本草图如下:
/* 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

您需要指定更新锁而不是共享锁,更新锁的作用是“现在是共享锁,但我打算在同一事务中稍后变为独占锁”,以防止可能的死锁。


基本上答案是“你不能”。谢谢。 - Joda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接