当连接因任何原因关闭时,我可以告诉 SQL Server “做某事”(例如释放应用程序级锁)吗?
背景:我想在应用程序级别而不是数据库级别锁定记录。但是,当应用程序崩溃时,我无法释放锁。基本上,我在我的应用程序中实现了以下算法:
function editRecord(recordId):
begin transaction
if (select lockedBy from myTable where id = recordId) is not empty:
commit
show "Sorry, record already in use by ..."
else
update myTable set lockedBy = current_user() where id = recordId
commit
show UI window to let user edit and update record
update myTablet set lockedBy = empty where id = recordId
我试图找出在连接崩溃时是否有一种简单的方法来摆脱应用程序级锁定。
SQL Server 提供了一种内置机制来支持应用程序锁定。支持的锁有 Shared、Update、IntentShared、IntentExclusive 和 Exclusive。死锁检测也是内置的,尽管应用程序锁死锁不会终止活动事务 - 您需要检查从系统过程调用返回的结果代码。联机丛书文档:
APPLOCK_MODE
APPLOCK_TEST
sp_getapplock
sp_releaseapplock
当会话注销时,与会话关联的锁会自动释放。
由@JonSeigel 的问题评论生成的社区 Wiki 答案