HiveBrain v1.2.0
Get Started
← Back to all entries
patternsqlMinor

Can I tell SQL Server to "do something" when a connection is closed?

Submitted by: @import:stackexchange-dba··
0
Viewed 0 times
cansqlclosedtellwhenserversomethingconnection

Problem

Can I tell SQL Server to "do something" (e.g. release an application-level lock) when the connection is closed for whatever reason?

Background: I want to lock a record on the application level, not on the database level. However, I'm having trouble releasing the lock when the application crashes. Basically, I am implementing the following algorithm in my application:

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


I'm trying to find out if there is an easy way to get rid of the application-level lock when the connection crashes.

Solution

SQL Server provides a built-in mechanism to support application locking. The locks supported are Shared, Update, IntentShared, IntentExclusive, and Exclusive. Deadlock detection is also built-in, though application lock deadlocks do not terminate the active transaction - you need to check the result code returned from the system procedure call. Books Online documentation:

APPLOCK_MODE

APPLOCK_TEST

sp_getapplock

sp_releaseapplock

Locks associated with the session are automatically released when the session is logged out.

Community Wiki answer generated from a question comment by @JonSeigel

Context

StackExchange Database Administrators Q#43979, answer score: 5

Revisions (0)

No revisions yet.