sp_getapplock不工作?我希望以下代码使其他会话无法访问表,但事实并非如此

时间:2015-08-04 12:11:14

标签: sql-server tsql

在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

1 个答案:

答案 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;

然后你会被封锁。