Как реализовать вложенные транзакции SQL с ADO.NET? - PullRequest
3 голосов
/ 09 апреля 2010

Мне нужно реализовать вложенные транзакции в .NET с использованием ADO.NET .

Ситуация следующая:

--> Start Process (Begin Transaction)       

   --> Do DB things       

   --> Begin Transaction for step 1
   --> Step 1
   --> Commit transaction for step 1

   --> Begin transaction for step 2
   --> Step 2
   --> Rollback transaction for step 2

   --> etc ...

   --> Do DB things       


--> End Process(Commit or Rollback ALL commited steps --> a.k.a the process)

Можно ли это сделать с помощью областей транзакции?Может ли кто-нибудь опубликовать пример?

Кроме того, мне нужно, чтобы этот процесс работал для баз данных SQL Server 2005 и Oracle 10g ... Будут ли области транзакций работать с обоими механизмами баз данных?

Редактировать: Обратите внимание, что такая ситуация может возникнуть:

Шаг 1 зафиксирован, шаг 2 откатан Шаг 3 зафиксирован.

Процесс зафиксирован

(Step1 и Step3 сохраняют данные в базе данных, step2 не )

С другой стороны ...

Step1 фиксируется, Step2 откатываетсяШаг 3 передается.

Процесс откатывается.

НЕТ ДАННЫХ СВЯЗАНО в базу данных

Примечание: Нет схемы БД или значений доменадоступны

Ответы [ 4 ]

3 голосов
/ 09 апреля 2010

Вы можете сделать это в TSQL через точки сохранения (SAVE TRAN на SQL Server), но, честно говоря, я не рекомендую этого. Вы не можете сделать это через TransactionScope, так как любой прерывание является терминальным (вся транзакция откатывается, как только любая транзакция в дереве показывает сбой).

Лично: сначала проверьте данные и выполняйте только действительные действия. Если это не удастся, то это терминал - откат его назад. Возможно разделить работу на атомарные единицы, которые могут быть действительно зафиксированы (или откатаны) в изоляции.

2 голосов
/ 09 апреля 2010

в Oracle:

BEGIN    
  SAVEPOINT STEP1;
  -- do some things
  IF your_criteria_for_commit_is_needed THEN
    NULL; -- do nothing
  ELSE
    ROLLBACK TO SAVEPOINT STEP1;
  END IF;

  SAVEPOINT STEP2;
  -- do some other things
  IF your_other_criteria_for_commit_is_needed THEN
    NULL; -- do nothing
  ELSE
    ROLLBACK TO SAVEPOINT STEP2;
  END IF;

  -- SOME NUMBER OF OTHER STEPS

  IF your_criteria_for_all_step_commit_is_needed THEN
    COMMIT; -- commit all changes to DB
  ELSE
    ROLLBACK; -- rollback all changes
  END IF;
END;
/
2 голосов
/ 09 апреля 2010

В этой статье говорится о точках сохранения и вложенных транзакциях.

http://msdn.microsoft.com/en-us/library/ms971557.aspx

0 голосов
/ 09 апреля 2010

Если вы хотите, чтобы ВСЕ шаги были зафиксированы или НЕТ, то не будет ли более подходящей одна транзакция? Вы можете передать существующий объект транзакции в конструктор объекта команды ADO.Net и, таким образом, выполнить несколько обновлений в рамках одной транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...