SQL Server TABLOCKX未锁定表

SQL Server TABLOCKX未锁定表,sql,sql-server-2008,sql-server-2016,Sql,Sql Server 2008,Sql Server 2016,我有一个包含数百万条记录的大表,我尝试使用TABLOCKX,我必须以独占方式更新一些数据 我测试这个事务 BEGIN TRANSACTION SELECT * FROM [MyDatabase].[dbo].[MyTable] WITH (TABLOCKX) WHERE 0 = 1 WAITFOR DELAY '00:30' ROLLBACK TRANSACTION 如果我尝试以这种方式选择数据 SELECT * FROM [MyDatabase].[dbo].[MyTable]

我有一个包含数百万条记录的大表,我尝试使用
TABLOCKX
,我必须以独占方式更新一些数据

我测试这个事务

BEGIN TRANSACTION

SELECT * 
FROM [MyDatabase].[dbo].[MyTable] WITH (TABLOCKX) 
WHERE 0 = 1

WAITFOR DELAY '00:30'

ROLLBACK TRANSACTION
如果我尝试以这种方式选择数据

SELECT *  
FROM [MyDatabase].[dbo].[MyTable]
桌子上没有锁,我可以读取数据

但我发现,如果我尝试以另一种方式从表中选择锁,它就会工作

SELECT *  
FROM [MyDatabase].[dbo].[MyTable] WITH (TABLOCKX)

为什么??我试图用3O4记录创建另一个表测试,锁在没有“with(TABLOCKX)”的情况下工作正常。

您好,我认为问题在于WHERE条件,因为0=1总是FALSE。@DanielE。我现在试过了,但没用…:(为什么不将
隔离级别设置为serializable
?发生了什么事情让你认为锁正在工作/不工作?你也在使用2008或2016?为什么要同时标记这两个?TabAlleman我同时标记这两个,因为我在2008和2016年对此进行了测试,两个都有相同的奇怪行为。锁只在带有“with(TABLOCKX)”的查询上工作如果没有,我可以读取未提交的数据。您好,我认为问题出在WHERE条件下,因为0=1总是错误的。@DanielE。我现在尝试了,但它不起作用…:(为什么不将
隔离级别设置为serializable
?发生了什么事情让你认为锁正在工作/不工作?你也在使用2008或2016?为什么要同时标记这两个?TabAlleman我同时标记这两个,因为我在2008和2016年对此进行了测试,两个都有相同的奇怪行为。锁只在带有“with(TABLOCKX)”的查询上工作如果没有,我可以读取未提交的数据。