Почему эта таблица заблокирована во время выполнения процедуры?

#sql-server #locking

#sql-server #блокировка

Вопрос:

У меня есть процедура MS SQL Server, которая в основном является оболочкой для пары других процедур и которая регистрирует свой процесс в таблице ведения журнала по мере его выполнения.

В основном это:

 insert into myLogTable(message, session_id)
    select 'Starting First Proc', @session_id

exec longRunningProc

insert into myLogTable(message, session_id)
    select 'Starting Next Proc', @session_id

exec nextLongRunningProc

insert into myLogTable(message, session_id)
    select 'Done', @session_id
 

Во время выполнения он сохраняет блокировку myLogTable все время. Если я использую подсказку nolock, я могу запросить myLogTable, но что меня удивило, так это то, что во время выполнения nextLongRunningProc строка, записанная перед ней (где message = ‘Запуск следующей процедуры’), заблокирована — я не получаю эту строку, возвращенную до завершения nextLongRunningProc.

Мне любопытно, почему эта строка будет заблокирована, и могу ли я что-нибудь сделать в основной процедуре, чтобы убедиться, что она разблокирована после записи этой строки.

Ответ №1:

В этом примере используется неявное TRANSACTION . Используйте явные транзакции для настройки ваших транзакций, чтобы ограничить продолжительность блокировок. Например:

 BEGIN TRANSACTION first_name;
insert into myLogTable(message, session_id)
COMMIT;

BEGIN TRANSACTION second_name;
select 'Starting First Proc', @session_id
exec longRunningProc
insert into myLogTable(message, session_id)
COMMIT;

BEGIN TRANSACTION third_name;
select 'Starting Next Proc', @session_id
exec nextLongRunningProc
insert into myLogTable(message, session_id)
select 'Done', @session_id
COMMIT;