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


25

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

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

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

Answers:


5

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

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

我将其留给Paul进行确认,方法是使用调试器逐步检查SQL数据库引擎代码:-)


1

sp_getapplock在信号量而不是物理对象上(根据MSDN)创建锁。如果sp_getapplock具有相同的字符串并且具有不兼容的锁定模式,则它将仅阻止另一个进程。

因此,在以下情况下将取消锁定请求:具有较高特权的用户取消锁定,服务器进程取消锁定,运行存储过程的用户或管理员取消锁定过程。您的描述可能是“系统或其他用户取消了锁定”。我不确定您如何确定取消锁定的实际进程/用户。


-1

有一个相应的Release应用程序锁存储过程,称为sp_releaseapplock。

我写了容易混淆的标题为“互斥在SQL”的文章在这里上的SQL Server中央有关使用这些存储过程来控制应用程序流。


4
看起来您在回答标题中的问题,但实际的问题是“在什么情况下sp_getapplock返回-2?”
马丁·史密斯

锁定请求已取消。确实,这很奇怪。进程如何在不知道已被取消的情况下取消自己的锁定请求!您可能不得不接受,除了一个MS提供的错误之外,您无法给出有意义的错误-“锁定请求已取消”。
Toby
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.