如何取消 SQL Server 中的应用锁定请求?

Hei*_*nzi 25 sql-server locking

sp_getapplock存储过程有以下返回值:

0:同步成功授予锁。
1:等待其他不兼容的锁释放后,成功授予锁。
-1:锁定请求超时。
-2:锁定请求被取消。
-3:锁定请求被选为死锁牺牲品。
-999:表示参数验证或其他调用错误。

我正在编写一个用于调用sp_getapplock我们的数据访问层的包装器,我想知道在什么情况下可以返回 -2,以便我可以抛出一个描述性和有用的异常。-1 和 -3 的返回值的含义很明显,我可以轻松创建导致返回这些值的测试条件。我将如何设法获得 -2 的返回值?

Dan*_*man 6

查看sp_getapplock包装过程的来源,除 -999 外的所有返回值均来自底层sys.xp_userlock 内部存储过程。我敢打赌,当请求被注意事件(客户端查询超时或显式客户端查询取消)取消时,内部 proc 会返回 -2。但是,sp_getapplock取消批处理后不会再执行任何代码,包括RETURN语句。因此,-2 返回码可能会在内部返回,但客户端没有实用的方法来获取该值。

假设这个理论是正确的,将 -2 转换为更具描述性的消息没有任何价值,因为首先是客户端取消了请求。

我将通过使用调试器逐步执行 SQL 数据库引擎代码来让 Paul 确认这一点:-)