TABLOCKX无法正常工作

时间:2016-03-13 19:43:47

标签: sql-server sql-server-2012 table-lock

我正在玩我的SQL Server 2012尝试获取锁定。根据我看到的教程,我尝试测试获取表上的独占锁,以便其他任何查询都无法从中读取信息,直到事务未结束,但它只是不起作用。即使它在视频中工作,这是我在第一个窗口中的查询:

use TSQL2012

BEGIN transaction

update tele with (TABLOCKX, holdlock) 
set cor = '12'

waitfor delay '00:05'
go

然后在第二个查询窗口中我尝试了:

select * from tele

并且它运行良好,虽然理论上应该有“独占”锁定防止这种情况。为什么会这样?我也试过

set transaction isolation level serializable on

并且没有延迟但选择总是成功的。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我已经在两张不同的桌子上尝试了这一点,并且可以轻松地重现您发现的内容。以下是发生的事情:

如果Sql-Server在更新表之前将行返回到SELECT查询,则很可能在此时,远程表上已经存在与独占锁不兼容的锁。例如,如果某个地方已经有一个读取器锁定在某个地方,那么你的UPDATE语句将被挂起,其WAIT_TYPE为LCK_M_X,这意味着您的UPDATE被阻止,等待与独占锁不兼容的锁定为释放。由于所有锁都与独占表锁不兼容,因此当任何其他会话使用任何类型的锁访问该表时,您的更新语句将被挂起。

在SQL Management Studio的第3个实例中,右键单击您的服务器并打开活动监视器。过滤您的数据库并登录并重新运行实验。如果表是应用程序经常使用的表,并且SELECT在UPDATE之前运行,那么您将在UPDATE注意到LCK_M_X WAIT_TYPE。

尝试创建只有您了解并重新运行实验的新表格。它应该工作。