Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 sp_releaseapplock  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Господа кто-нибудь сталкивался с таким поведение sp_releaseapplock?

Опишу ситуацию: есть процедурка - внутри навешивается эксклюзивная блокировка на некоторый ресурс с помощью sp_getapplock, по окончании СП - снимается с помощью sp_releaseapplock, в принципе все хорошо работает, но сейчас заметил косяк что время от времени после окончания работы СП (при ручном запуске SP из SSMS) в блокировках остается висеть блокировка и снять ее для той же самой сессии которая ее получила не получается.

вот наглядный скриншот:
28 июн 17, 14:52    [20596908]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172


К сообщению приложен файл. Размер - 110Kb
28 июн 17, 14:53    [20596912]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36698
Нужен не скриншот, а код и коды возврата процедур sp_getapplock и sp_releaseapplock.
28 июн 17, 14:53    [20596917]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
select @@spid,
       applock_mode('public', 'Req_6C9575EB_1D68_423D_994B_A515', 'Session'),
       applock_mode(N'public', N'Req_6C9575EB_1D68_423D_994B_A515', N'Session'),
       applock_test('public', 'Req_6C9575EB_1D68_423D_994B_A515', 'Exclusive', 'Session'),
       applock_test(N'public', N'Req_6C9575EB_1D68_423D_994B_A515', N'Exclusive', N'Session')

--Выход:90	NoLock	NoLock	1	1
28 июн 17, 14:58    [20596947]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Гавриленко Сергей Алексеевич
Нужен не скриншот, а код и коды возврата процедур sp_getapplock и sp_releaseapplock.


А оно и не дойдет до кода возврата, там исключение блокирующее

declare @r int
exec @r = sp_releaseapplock
N'Req_6C9575EB_1D68_423D_994B_A515',
N'Session',
'public'

select @r

/* Выход:
Сообщение 1223, уровень 16, состояние 1, процедура xp_userlock, строка 1
Cannot release the application lock (Database Principal: 'public', Resource: 'Req_6C9575EB_1D68_423D_994B_A515') because it is not currently held.

*/
28 июн 17, 15:00    [20596964]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36698
Вы обработали результат sp_getapplock, чтобы убедиться, что блокировка была таки наложена в вашем скоупе вашей сессией?
28 июн 17, 15:02    [20596977]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
При этом меня настораживает request_reference_count из dm_tran_locks, это вроде как свидетельствует что процедура три раза запрашивала блокировку ресурса и три раза ее получила или 4.

Не суть важно, процедуру я действительно с одними и теми же параметрами дергал раза 3-4 почему блокировка не снялась не совсем ясно, но главная проблема почему из той же сессии которая получила блокировку но вне процедуры я не могу ее снять?
28 июн 17, 15:04    [20596988]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Гавриленко Сергей Алексеевич,

+ SP

ALTER PROCEDURE [SomeProc]
     @XmlData XML,
     @ErrMsg XML = NULL OUTPUT
--WITH EXECUTE AS SELF
AS
DECLARE
       @RetVal INT,
       @TranCount INT,
       @lockResource NVARCHAR(255),
       @RequestID UNIQUEIDENTIFIER,

SET @TranCount = @@TRANCOUNT
SET @RequestID = @XmlData.value('(/Request/@Id)[1]', 'UNIQUEIDENTIFIER')
SET @lockResource = 'Req_' + ISNULL(REPLACE(TRY_CONVERT(NVARCHAR(36), @RequestID), NCHAR(45), NCHAR(95)), N'00000000_0000_0000_0000_000000000000')

IF @TranCount > 0
    SAVE TRANSACTION [SAV_01]
ELSE
    BEGIN TRANSACTION

IF APPLOCK_TEST('public', @lockResource, 'Exclusive', 'Session') = 0 BEGIN
    SET @RetVal = 50002
    SET @ErrMsg = '<Response State="Error" Code="50002" Severity="1"><Comment>Невозможно получить блокировку по идентификатору запроса. Текущий запрос обрабатывается другой сессией</Comment></Response>'
    GOTO _RETURNPOINT
END

EXEC @RetVal = sp_getapplock
    @DbPrincipal = 'public',
    @Resource = @lockResource,
    @LockMode = 'Exclusive',
    @LockOwner = 'Session'

IF ISNULL(@RetVal, 0) > 0 BEGIN
    SET @ErrMsg = '<Response State="Error" Code="50003" Severity="1"><Comment>При получении блокировки на объект произошла ошибка по коду:' + TRY_CONVERT(VARCHAR, ISNULL(@RetVal, 0)) + '</Comment></Response>'
    GOTO _RETURNPOINT
END

/*SOME_LOGIC*/

_RETURNPOINT:
IF @RetVal > 0 BEGIN
    If @TranCount > 0
        ROLLBACK TRANSACTION [SAV_01]
    ELSE
        ROLLBACK TRANSACTION

   /* SOME_ERROR_CATCH_LOGIC */
END
ELSE IF @TranCount = 0 AND XACT_STATE() = 1
    COMMIT TRANSACTION

EXEC sp_releaseapplock
    @Resource = @lockResource,
    @LockOwner = 'Session',
    @DbPrincipal = 'public'

RETURN @RetVal



сокращенный код процедуры.
28 июн 17, 15:13    [20597019]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
felix_ff
Req_6C9575EB_1D68_423D_994B_A515
Вовсе не означает, что блокировка была запрошена именно на такой ресурс. Для отображения берутся первые 32 символа и дополняются хешем в скобках.
28 июн 17, 15:20    [20597035]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
invm,

Да, спасибо что то забыл об этой особенности.

странно что блокировка тогда остается, но это уже другой вопрос.

Есть ли возможность узнать полное наименование ресурса блокировки? что бы ее снять без закрытия сессии
28 июн 17, 15:33    [20597101]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7407
felix_ff,

можно подумать о другом решении, гарантирующем последовательность выполнения - очередь сервис брокера в количеством ридеров = 1.
28 июн 17, 15:44    [20597144]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
felix_ff
Есть ли возможность узнать полное наименование ресурса блокировки?
Нет.
У вас же в процедуре расписано как оно генерится.
28 июн 17, 15:46    [20597155]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4395
felix_ff
invm,

Да, спасибо что то забыл об этой особенности.

странно что блокировка тогда остается, но это уже другой вопрос.

Есть ли возможность узнать полное наименование ресурса блокировки? что бы ее снять без закрытия сессии


IF @RetVal > 0 BEGIN
If @TranCount > 0
ROLLBACK TRANSACTION [SAV_01]
ELSE
ROLLBACK TRANSACTION

/* SOME_ERROR_CATCH_LOGIC */
END
ELSE IF @TranCount = 0 AND XACT_STATE() = 1
COMMIT TRANSACTION

EXEC sp_releaseapplock
@Resource = @lockResource,
@LockOwner = 'Session',
@DbPrincipal = 'public'


А что вы собрались релизить после COMMIT или ROLLBACK? Блокировка убирается, когда заканчивается транзакция.
28 июн 17, 15:49    [20597172]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
felix_ff,

В вашем случае напрашивается блокировка уровня транзакции, а не сессии.
Проверять наличие блокировки через APPLOCK_TEST бесполезно - результат становится неактуальным сразу после получения. Нужно анализировать результат sp_getapplock при вызове с @LockTimeout = 0.
28 июн 17, 15:52    [20597181]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
a_voronin
Блокировка убирается, когда заканчивается транзакция.
Блокировка уровня сессии? Серьезно?
28 июн 17, 15:53    [20597184]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
aleks2
Guest
invm
a_voronin
Блокировка убирается, когда заканчивается транзакция.
Блокировка уровня сессии? Серьезно?

Сирьезней некуда.

ВСЕ изменения транзакции будут отменены на rollback.

Или ты думаешь в MS SQL есть "особенные" таблицы?
28 июн 17, 18:45    [20597828]     Ответить | Цитировать Сообщить модератору
 Re: sp_releaseapplock  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
aleks2
Сирьезней некуда.

ВСЕ изменения транзакции будут отменены на rollback.

Или ты думаешь в MS SQL есть "особенные" таблицы?
Стало скучно и опять решил поумничать?
Ну так надо было сначала осознать о чем тут речь идет и только потом пытаться умничать.
28 июн 17, 19:06    [20597864]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить