транзакции с использованием C # для обновления базы данных - PullRequest
0 голосов
/ 20 июля 2011

Я делаю многоуровневое приложение MVFM WPF, которое подключено к базе данных Oracle. Мне нужны пояснения по поводу TransactionScope. Рассмотрим следующий пример:

using (TransactionScope ts = new TransactionScope())
{
   ...
   bank.setID(BankName, Branch);

   check.addCheck(check);
   ...
   ts.Complete();
}

Этот код предназначен только для пояснения: bank.setID() обновляет запись, тогда как addCheck фактически вставляет запись. Я не мог понять, как это проверить. Я хотел выполнить обновление и завершение работы базы данных перед вставкой вторым методом, а затем проверить, не откатилось ли обновление. Это уже правильно? Я на правильном пути? Это цель TransactionScope?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

TransactionScope хорошо задокументировано. MSDN ит.

, чтобы проверить, как это работает, нет необходимости переводить базу данных в автономный режим.используйте этот фрагмент:

using (TransactionScope ts = new TransactionScope())
        {
           try
              {
              ...
               bank.setID(BankName, Branch);
               throw new System.InvalidOperationException("sht happens");
               check.addCheck(check);
               ...
               ts.Complete();
              }
          catch
              {
               //catch the exception
               //ts.Complete() is not called, thus update/insert rollbacks
              }
        }
2 голосов
/ 20 июля 2011

Редактировать: Сначала я не был уверен, что вы понимаете транзакции с БД, поэтому вот очень краткое описание:

TransactionScope предназначено для переноса транзакция базы данных с механизмом, безопасным для исключительных ситуаций .

. Вы используете его для переноса набора операций, которые должны быть атомарными , странзакции, поэтому, если вы потерпите неудачу в одном обновлении, все действия БД в этой транзакции будут отменены.

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

Я хотел выполнить обновление и завершить работу базы данных перед вставкой вторым методом, а затем проверить, не откатилось ли обновление ... AmЯ на правильном пути?

Да.Ваш код уже должен обрабатывать его:

  • Если база данных отключена до того, как addCheck выполнит вставку, то вставка должна вызвать исключение
  • Поскольку генерируется исключение, Complete никогда не должен вызываться
  • Блок finally должен автоматически откатывать транзакцию при достижении (скрытого) блока finally, а Complete не вызывается

Я не мог понять, как это проверить

Если вы хотите написать модульный тест для своего кода, то я бы не предложил "«переводить БД в автономный режим в середине выполнения».

Вместо этого я бы предложил сделать вашу логику БД достаточно гибкой, чтобы указывать на разные БД.Затем удалите таблицу или некоторые столбцы, в которые вставляется addCheck.Попробуйте настроить вашу БД так, чтобы setID был успешным, а addCheck - неудачным.

...