TransactionScope и хранимая процедура?

У меня есть две хранимые процедуры PL / SQL, каждая из которых обрабатывает свою транзакцию (начало / фиксация и откат в случае ошибки). Из кода .Net я называю эти два SP, как показано ниже.

   using (TransactionScope ts = new TransactionScope())
     {
          CallSP1();
          CallSP2().
          ts.SetComplete();
     }

Если мой вызов SP2 завершится неудачно, откатит ли он изменения, внесенные CallSP1 ()? Если он не откатывается, значит ли это, что транзакцию лучше обрабатывать из приложения .Net, а не внутри хранимой процедуры?


person Amitabh    schedule 05.03.2010    source источник


Ответы (3)


Если первая хранимая процедура с пакетом обновления 1 выдает фиксацию, любые изменения, которые она уже внесла, будут постоянными. В этом случае, если SP2 выйдет из строя, изменения, внесенные SP1, не будут отменены.

IMO вызывающее приложение должно обрабатывать логику транзакции, то есть не выполнять фиксацию или откат в ваших процедурах PL / SQL. Позвольте ошибкам распространиться на вызывающее приложение, тогда механизм PL / SQL откатит только работу, выполненную неудачной процедурой, а не всю транзакцию.

Позвольте вызывающему приложению решить, что делать в случае ошибки (повторить попытку, зафиксировать половину работы? Или откат).

person Vincent Malgrat    schedule 05.03.2010
comment
+1. Никакая процедура не должна фиксироваться - должна быть только точка сохранения / откат - если только это не конечный вызывающий; главный {} в программе. - person Adam Musch; 06.03.2010

Если SP1 выполняет фиксацию, не имеет значения, что происходит в SP2. Изменения, внесенные в SP1, не будут отменены - они зафиксированы.

person DCookie    schedule 05.03.2010

Если ваша первая хранимая процедура всегда выдает либо фиксацию, либо откат, то никакие действия второй хранимой процедуры не могут повлиять на эту транзакцию.

Если вы хотите, чтобы вызывающее приложение управляло всей транзакцией, а хранимые процедуры обрабатывали откат собственных изменений в случае ошибки, один из способов сделать это - определить точку сохранения в начале хранимой процедуры. Тогда блок исключений хранимой процедуры может откатиться к точке сохранения, а не к началу транзакции (фиксации в этом случае не должны включаться в хранимые процедуры). Конечно, в этом сценарии было бы важно, чтобы хранимая процедура уведомляла приложение о возникновении ошибки, а приложение обрабатывало этот случай соответствующим образом.

person Allan    schedule 05.03.2010