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

Откуда:
Сообщений: 124
Есть задача, написать хранимку, контекст вызова которой неизвестен, транзакционно что-то сделав, либо откатив сделанной прозрачно для вызывающего ее кода
Написал вот такой пример
create procedure p2 
as
  begin try
    begin tran t2
    save tran s2
      --exec ('select * from qwe')
      select cast('a' as date)
  end try
  begin catch
    print 'p2 '+error_message()
    if xact_state()=1 
    begin
      rollback tran s2
      commit
    end
    if xact_state()=-1
      rollback
  end catch
go

create procedure p1
as
  begin try
    begin tran
      exec p2
    commit
  end try
  begin catch
    print 'p1 '+error_message()
    if xact_state()<>0 rollback
  end catch
go

exec p1

drop procedure p1
drop procedure p2


Все работает, кроме случае возникновения uncommitable транзакции
При выходе из p2 в p1 снова попадаю в кеч-блок (из-за несовпадаения @@trancount на выходе-выходе из нее)

В примере MS обходится за счем отказа от глобального ROLLBACK во вложенной процедуре, пробрасывания ошибки наружу и отката транзакции на верхнем уровне
https://msdn.microsoft.com/ru-ru/library/ms188378(v=sql.120).aspx

Можно ли как-то откатить транзакцию вплотную к ошибке, не пробрасывая ошибку вверх, не получив при этом ворнингов?
3 ноя 15, 11:12    [18363002]     Ответить | Цитировать Сообщить модератору
 Re: Откат uncommittable во вложенной процедуре без ворнингов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
unno
Есть задача, написать хранимку, контекст вызова которой неизвестен, транзакционно что-то сделав, либо откатив сделанной прозрачно для вызывающего ее кода


Ваша задача решения не имеет, ибо как написано в БОЛ
БОЛ
Ошибки, приводящие к прерыванию подключения к базе данных и обычно имеющие уровень серьезности от 20 до 25, не обрабатываются блоком CATCH, так как при разрыве соединения выполнение прерывается.
3 ноя 15, 12:01    [18363407]     Ответить | Цитировать Сообщить модератору
 Re: Откат uncommittable во вложенной процедуре без ворнингов  [new]
unno
Member

Откуда:
Сообщений: 124
Не понимаю, какое отношение ваш комментарий имеет к задаче обработки uncommitable транзакции
3 ноя 15, 14:49    [18364578]     Ответить | Цитировать Сообщить модератору
 Re: Откат uncommittable во вложенной процедуре без ворнингов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Можно ли как-то откатить транзакцию вплотную к ошибке, не пробрасывая ошибку вверх, не получив при этом ворнингов?


Проблемой отката и должна заниматься процедура верхнего уровня, проталкивание ошибки наверх правильное решение.

save tran необходимо использовать лишь соответственно бизнес-логике, а не обработке ошибки. Частично откатив, Вы окажете приложению медвежью услугу.
3 ноя 15, 14:53    [18364608]     Ответить | Цитировать Сообщить модератору
 Re: Откат uncommittable во вложенной процедуре без ворнингов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
unno
Не понимаю, какое отношение ваш комментарий имеет к задаче обработки uncommitable транзакции


потому что
автор
контекст вызова которой неизвестен


ну а про ваш "uncommitable"

добавить проверку if @@trancount<>0 не?
3 ноя 15, 14:55    [18364621]     Ответить | Цитировать Сообщить модератору
 Re: Откат uncommittable во вложенной процедуре без ворнингов  [new]
unno
Member

Откуда:
Сообщений: 124
WarAnt
unno
Не понимаю, какое отношение ваш комментарий имеет к задаче обработки uncommitable транзакции


потому что
автор
контекст вызова которой неизвестен


ну а про ваш "uncommitable"

добавить проверку if @@trancount<>0 не?


добавьте
так, чтобы роллбак был внутри p2
и не сработал catch в p1
3 ноя 15, 15:16    [18364769]     Ответить | Цитировать Сообщить модератору
 Re: Откат uncommittable во вложенной процедуре без ворнингов  [new]
unno
Member

Откуда:
Сообщений: 124
Владислав Колосов
Можно ли как-то откатить транзакцию вплотную к ошибке, не пробрасывая ошибку вверх, не получив при этом ворнингов?


Проблемой отката и должна заниматься процедура верхнего уровня, проталкивание ошибки наверх правильное решение.

save tran необходимо использовать лишь соответственно бизнес-логике, а не обработке ошибки. Частично откатив, Вы окажете приложению медвежью услугу.


возможно
у себя так и сделал
но тем не менее, задачи бывают разные, и интересно, есть ли возможность такого варианта обработки отката транзакции
3 ноя 15, 15:19    [18364797]     Ответить | Цитировать Сообщить модератору
 Re: Откат uncommittable во вложенной процедуре без ворнингов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
unno

добавьте
так, чтобы роллбак был внутри p2
и не сработал catch в p1


Мне то это зачем, я не пытаюсь использовать сиквел в несвойственных для него эпостасиях, вам нужно вы и добавляйте.
3 ноя 15, 15:25    [18364836]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить