TransactionScope и хранимая процедура? - PullRequest
3 голосов
/ 05 марта 2010

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

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

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

Ответы [ 3 ]

10 голосов
/ 05 марта 2010

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

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

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

2 голосов
/ 05 марта 2010

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

1 голос
/ 05 марта 2010

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

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

...