begin transaction
...
<Здесь идет длительный SQL оператор, допустим UPDATE>
set @error = @@error
if @error = 123
<выполнение действий по этому виду ошибки>
else
if @error = 456
<выполнение действий по этому виду ошибки>
if @error > 0
rollback transaction
else
commit transaction
если прервать выполнение процедуры на этапе выполнения <длительного оператора> то транзакция остается открыта
(это можно увидеть и в Query analyser'е)
Вопрос вот в чем:
Может можно каким либо образом указать чтобы при отмене(именно при отмене) выполнения процедуры, сервер автоматически откатывал открытую транзакцию?
Здравствуйте, Алексей К., Вы писали:
АК>Вот некоторый фрагмент кода хранимой процедуры
АК>
АК>begin transaction
АК>...
АК><Здесь идет длительный SQL оператор, допустим UPDATE>
АК>set @error = @@error
АК>if @error = 123
АК> <выполнение действий по этому виду ошибки>
АК>else
АК>if @error = 456
АК> <выполнение действий по этому виду ошибки>
АК>if @error > 0
АК> rollback transaction
АК>else
АК> commit transaction
АК>
АК>если прервать выполнение процедуры на этапе выполнения <длительного оператора> то транзакция остается открыта АК>(это можно увидеть и в Query analyser'е)
АК>Вопрос вот в чем: АК>Может можно каким либо образом указать чтобы при отмене(именно при отмене) выполнения процедуры, сервер автоматически откатывал открытую транзакцию?
For example, you terminate SP with command ‘kill’ while <long running statement> is being executed, in this case process gets 'KILLED/ROLLBACK' status. However, rollback process could also take a long time, so your process will live with the status 'KILLED/ROLLBACK' until rollback complete.
Здравствуйте, Алексей К., Вы писали: АК>если прервать выполнение процедуры на этапе выполнения <длительного оператора> то транзакция остается открыта АК>(это можно увидеть и в Query analyser'е)
Что такое "прервать"? Если процедура выполняет выход самостоятельно, то она и обязана сама сделать rollback. Если она была прервана принудительно (например, при помощи kill, или ее транзакция была выбрана жертвой deadlock, то все в порядке — транзакция будет откачена.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Все бы хорошо, но у меня прерывание выполнения процедуры инициирует клиент — грубо говоря нажимает кнопку "Отмена". При этом для него выполнение процедуры завершается, но транзакция открыта.
Такая картина при запуске из Query analiser'a в профайлере
SP:Starting exec test1
SP:StmtStarting -- test1 begin transaction
SP:StmtCompleted -- test1 begin transaction
SP:StmtStarting -- test1
SELECT * FROM aaa INNER JOIN bbb ON aaa.pk_aaa = bbb.fk_bbb
SQL:BatchCompleted exec test1
Attention
SQL:BatchCompleted
На выполнении select'a я прерываю — выполнение процедуры прекращается но до следующей строки где идет rollback
дело не доходит:
имею открытую транзакцию и завершенную процедуру. Получаю при этом Attention — который нигде не могу поймать
Здравствуйте, Алексей К., Вы писали:
АК>Но тот же эффект достигается если в Query anal-re нажать на "стоп" во время выполнения процедуры АК>(интересно как этот "стоп" сделан в Query anal-re?)
Здравствуйте, Lexey, Вы писали:
L>Попробуй SET XACT_ABORT ON в процедуре
Пробовал
Транзакция откатывается — все замечательно... Но!
Все хорошо когда прерываем извне.
Если же в <длительном операторе> произойдет ошибка (допустим lock_timeout), то мне хотелось бы проанализировать ошибку и выполнить определенные действия по обработке ошибки, а в случае применения SET XACT_ABORT ON выполнение оператора прервется а вметсе с ним прервется выполнение самой процедуры, что для меня неприемлемо
Здравствуйте, Алексей К., Вы писали:
L>>Попробуй SET XACT_ABORT ON в процедуре
АК>Пробовал АК>Транзакция откатывается — все замечательно... Но! АК>Все хорошо когда прерываем извне. АК>Если же в <длительном операторе> произойдет ошибка (допустим lock_timeout), то мне хотелось бы проанализировать ошибку и выполнить определенные действия по обработке ошибки, а в случае применения SET XACT_ABORT ON выполнение оператора прервется а вметсе с ним прервется выполнение самой процедуры, что для меня неприемлемо