请求表上的 Sch-M 锁

art*_*hur 2 sql-server locking

我可以在读取未提交模式下访问数据库,并且需要在操作环境中对表进行维护。我需要获取一个表的排他锁,做一个工作,然后释放锁。

在此维护期间,即使读取查询也不应将未提交的数据取回。

这个问题和答案看起来很有希望。我愿意:

begin transaction;
SELECT TOP (1) 1 FROM a WITH (TABLOCK);
Run Code Online (Sandbox Code Playgroud)

但是随后,SIX在 table 上获得了锁a。但是,这不会从选择查询中锁定表。如何获取Sch-M表上的锁?我最多可以通过以下方式获得Sch-S锁定:

SELECT TOP (1) * FROM a WITH (TABLOCK);
Run Code Online (Sandbox Code Playgroud)

这仍然不会阻止表上的选择查询。

Pau*_*ite 5

有很多方法可以按字面意思执行您的要求,但我通常建议不要使用其中任何一种。在大多数情况下,您需要做的就是在流程完成时阻止对表进行任何更改。这可以通过TABLOCKX交易中的提示来完成:

SELECT TOP (0) NULL FROM Production.Product AS P WITH (TABLOCKX);
Run Code Online (Sandbox Code Playgroud)

您还可以暂时撤销权限,或使用应用程序锁。存在其他替代方案;最好的方法取决于细节。

如果您真的想获取 Sch-M(系统锁),一种方法是调用sp_compile例如:

-- AdventureWorks sample database
BEGIN TRANSACTION;
EXECUTE sys.sp_recompile @objname = N'Production.Product';
SELECT * FROM sys.dm_tran_locks AS DTL WHERE DTL.request_session_id = @@SPID;
ROLLBACK TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

如果表的全部内容因您正在进行的任何维护而无效,那么您在执行TRUNCATE TABLE. 同样,什么是最好的取决于尚未提供的详细信息。