sp_getapplock存储过程具有以下返回值:
0:成功同步授予锁。
1:等待其他不兼容的锁释放后,锁被成功授予。
-1:锁请求超时。
-2:锁定请求被取消。
-3:锁定请求被选为死锁牺牲品。
-999:表示参数验证或其他调用错误。
我正在编写一个用于调用sp_getapplock
我们的数据访问层的包装器,我想知道在哪些情况下可以返回 -2,以便我可以抛出一个描述性和有用的异常。很明显 -1 和 -3 的返回值意味着什么,我可以轻松创建导致返回这些值的测试条件。我将如何设法获得 -2 的返回值?
查看
sp_getapplock
wrapper proc 的源代码,除了 -999 之外的所有返回值都来自底层的sys.xp_userlock
内部存储过程。我敢打赌,当请求被注意事件(客户端查询超时或显式客户端查询取消)取消时,内部过程会返回 -2。但是,sp_getapplock
在取消批处理后不会执行任何其他代码,包括RETURN
语句。因此,-2 返回码可能会在内部返回,但客户端没有实际的方法来获取该值。假设这个理论是正确的,那么将 -2 转换为更具描述性的消息没有任何价值,因为首先取消请求的是客户端。
我将让 Paul 通过使用调试器逐步执行 SQL 数据库引擎代码来确认这一点 :-)
sp_getapplock 在信号量上创建锁,而不是在物理对象上创建锁(根据 MSDN)。只有当它是具有相同字符串且锁定模式不兼容的 sp_getapplock 时,它才会阻塞另一个进程。
因此,在以下情况下,锁请求将被取消:具有更高权限的用户取消锁定、服务器进程取消锁定、运行存储过程的用户或管理员杀死锁定进程。您的描述可能是“系统或其他用户取消锁定”。我不确定您将如何确定取消锁定的实际进程/用户。
有一个相应的释放应用程序锁存储过程称为 sp_releaseapplock。
我在 SQL Server Central 上写了一篇标题为“SQL 中的互斥锁”的文章,关于使用这些存储过程来控制应用程序流。