Автооткат прерванных транзакций в MSSQL
От: Алексей К.  
Дата: 22.03.04 15:17
Оценка:
Вот некоторый фрагмент кода хранимой процедуры

begin transaction
...
<Здесь идет длительный SQL оператор, допустим UPDATE>

set @error = @@error

if @error = 123
    <выполнение действий по этому виду ошибки>
else
if @error = 456
    <выполнение действий по этому виду ошибки>

if @error > 0
   rollback transaction
else
   commit transaction


если прервать выполнение процедуры на этапе выполнения <длительного оператора> то транзакция остается открыта
(это можно увидеть и в Query analyser'е)

Вопрос вот в чем:
Может можно каким либо образом указать чтобы при отмене(именно при отмене) выполнения процедуры, сервер автоматически откатывал открытую транзакцию?
Re: Автооткат прерванных транзакций в MSSQL
От: phwp  
Дата: 22.03.04 23:21
Оценка:
Здравствуйте, Алексей К., Вы писали:

АК>Вот некоторый фрагмент кода хранимой процедуры


АК>
АК>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.
Re: Автооткат прерванных транзакций в MSSQL
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.03.04 04:11
Оценка:
Здравствуйте, Алексей К., Вы писали:
АК>если прервать выполнение процедуры на этапе выполнения <длительного оператора> то транзакция остается открыта
АК>(это можно увидеть и в Query analyser'е)
Что такое "прервать"? Если процедура выполняет выход самостоятельно, то она и обязана сама сделать rollback. Если она была прервана принудительно (например, при помощи kill, или ее транзакция была выбрана жертвой deadlock, то все в порядке — транзакция будет откачена.
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Автооткат прерванных транзакций в MSSQL
От: Алексей К.  
Дата: 23.03.04 07:27
Оценка:
Всем доброе утро

Все бы хорошо, но у меня прерывание выполнения процедуры инициирует клиент — грубо говоря нажимает кнопку "Отмена". При этом для него выполнение процедуры завершается, но транзакция открыта.

Такая картина при запуске из 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 — который нигде не могу поймать
Re[2]: Автооткат прерванных транзакций в MSSQL
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.03.04 08:09
Оценка:
Здравствуйте, Алексей К., Вы писали:

АК>На выполнении select'a я прерываю

Что такое "я прерываю"? Каким методом ты это делаешь?
... << RSDN@Home 1.1.3 beta 2 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Автооткат прерванных транзакций в MSSQL
От: Алексей К.  
Дата: 23.03.04 08:19
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Что такое "я прерываю"? Каким методом ты это делаешь?


На клиенте Command->Cancel()

Но тот же эффект достигается если в Query anal-re нажать на "стоп" во время выполнения процедуры
(интересно как этот "стоп" сделан в Query anal-re?)
Re: Автооткат прерванных транзакций в MSSQL
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 23.03.04 09:28
Оценка:
Здравствуйте, Алексей К., Вы писали:

[]

В примере MSDN откат или подтверждение вызываются явно. См. здесь.
... << RSDN@Home 1.1.3 beta 1 >>
Re[4]: Автооткат прерванных транзакций в MSSQL
От: Lexey Россия  
Дата: 23.03.04 12:21
Оценка:
Здравствуйте, Алексей К., Вы писали:

АК>Но тот же эффект достигается если в Query anal-re нажать на "стоп" во время выполнения процедуры

АК>(интересно как этот "стоп" сделан в Query anal-re?)

Попробуй SET XACT_ABORT ON в процедуре
... << RSDN@Home 1.1.3 stable >>
Re[5]: Автооткат прерванных транзакций в MSSQL
От: Алексей К.  
Дата: 23.03.04 12:50
Оценка:
Здравствуйте, Lexey, Вы писали:

L>Попробуй SET XACT_ABORT ON в процедуре


Пробовал
Транзакция откатывается — все замечательно... Но!
Все хорошо когда прерываем извне.
Если же в <длительном операторе> произойдет ошибка (допустим lock_timeout), то мне хотелось бы проанализировать ошибку и выполнить определенные действия по обработке ошибки, а в случае применения SET XACT_ABORT ON выполнение оператора прервется а вметсе с ним прервется выполнение самой процедуры, что для меня неприемлемо
Re[6]: Автооткат прерванных транзакций в MSSQL
От: Lexey Россия  
Дата: 23.03.04 13:44
Оценка:
Здравствуйте, Алексей К., Вы писали:

L>>Попробуй SET XACT_ABORT ON в процедуре


АК>Пробовал

АК>Транзакция откатывается — все замечательно... Но!
АК>Все хорошо когда прерываем извне.
АК>Если же в <длительном операторе> произойдет ошибка (допустим lock_timeout), то мне хотелось бы проанализировать ошибку и выполнить определенные действия по обработке ошибки, а в случае применения SET XACT_ABORT ON выполнение оператора прервется а вметсе с ним прервется выполнение самой процедуры, что для меня неприемлемо

Ну тут, видимо, или или.
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.