#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;