我可以在未提交读取模式下访问数据库,并且需要在操作环境中对表进行维护。我需要在一个表上获得一个排他锁,做一个工作,然后释放锁。
在此维护期间,即使读取查询也不应该取回未提交的数据。
这个问题和答案看起来很有希望。我愿意:
begin transaction;
SELECT TOP (1) 1 FROM a WITH (TABLOCK);
但是随后,SIX
在 table 上获得了锁a
。但是,这不会从选择查询中锁定表。我怎样才能获得Sch-M
桌子上的锁?最多我可以通过以下方式获得Sch-S
锁:
SELECT TOP (1) * FROM a WITH (TABLOCK);
这仍然不会阻止对表的选择查询。
有很多方法可以按你的要求做,但我通常建议不要使用其中任何一种。在大多数情况下,您需要做的就是在流程完成时防止对表进行任何更改。这可以通过
TABLOCKX
交易中的提示来完成:您也可以暂时撤销权限,或使用应用程序锁定。存在其他替代方案;最好的方法取决于细节。
如果您真的想获得 Sch-M(系统锁),一种方法是调用
sp_compile
例如:如果表的全部内容因您所做的任何维护而失效,那么当您执行
TRUNCATE TABLE
. 同样,什么是最好的取决于尚未提供的细节。