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)”的查询上工作如果没有,我可以读取未提交的数据。