Posso dizer ao SQL Server para "fazer algo" (por exemplo, liberar um bloqueio no nível do aplicativo ) quando a conexão for fechada por qualquer motivo?
Histórico : desejo bloquear um registro no nível do aplicativo , não no nível do banco de dados. No entanto, estou tendo problemas para liberar o bloqueio quando o aplicativo trava. Basicamente, estou implementando o seguinte algoritmo em meu aplicativo:
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
Estou tentando descobrir se existe uma maneira fácil de se livrar do bloqueio no nível do aplicativo quando a conexão falha.
O SQL Server fornece um mecanismo interno para oferecer suporte ao bloqueio de aplicativos. Os bloqueios suportados são Shared, Update, IntentShared, IntentExclusive e Exclusive. A detecção de deadlock também é integrada, embora os deadlocks de bloqueio de aplicativo não terminem a transação ativa - você precisa verificar o código de resultado retornado da chamada de procedimento do sistema. Documentação dos livros on-line:
APPLOCK_MODE
APPLOCK_TEST
sp_getapplock
sp_releaseapplock
Os bloqueios associados à sessão são liberados automaticamente quando a sessão é desconectada.
Resposta do Community Wiki gerada a partir de um comentário de pergunta por @JonSeigel