当连接关闭时,我可以告诉 SQL Server“做某事”吗?

Hei*_*nzi 4 sql-server locking

当连接因任何原因关闭时,我可以告诉 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
Run Code Online (Sandbox Code Playgroud)

我试图找出是否有一种简单的方法可以在连接崩溃时摆脱应用程序级锁定。

Pau*_*ite 5

SQL Server 提供了一种内置机制来支持应用程序锁定。支持的锁有 Shared、Update、IntentShared、IntentExclusive 和 Exclusive。死锁检测也是内置的,尽管应用程序锁死锁不会终止活动事务 - 您需要检查从系统过程调用返回的结果代码。在线书籍文档:

APPLOCK_MODE
APPLOCK_TEST
sp_getapplock
sp_releaseapplock

当会话注销时,与会话关联的锁会自动释放。

由@JonSeigel 的问题评论生成的社区 Wiki 答案