在sql server session
中运行以下命令 CREATE DATABASE locktest
GO
CREATE TABLE locktest.dbo.lock_this_table (id INT)
BEGIN TRAN
EXEC locktest..sp_getapplock @Resource = 'lock_this_table',@LockMode = 'Exclusive'
在一个单独的窗口中,执行以下代码,我希望它在第一个事务保持打开时挂起,不知道它为什么没有?
SELECT * FROM locktest.dbo.lock_this_table
INSERT INTO locktest.dbo.lock_this_table
SELECT 4
答案 0 :(得分:0)
sp_getapplock
不会锁定表格。它是一个非SQL-Server对象的锁定器。它锁定了什么呢?它锁定名为@Resource
的唯一命名的,不区分大小写的字符串值。这意味着只有当他们 使用已被另一个连接锁定的sp_getapplock to attempt to acquire a lock on the identical string value of
@ Resource`时,才会阻止其他用户。
要专门锁定表格,您可以使用:
BEGIN TRAN;
SELECT TOP 0 * FROM locktest.dbo.lock_this_table WITH (TABLOCKX, HOLDLOCK);
-- Until the transaction is committed, this lock will be held
COMMIT TRAN;
然后,如果在提交上述事务之前对表执行任何操作,例如:
SELECT * FROM locktest.dbo.lock;
然后你会被封锁。