вторник, 29 апреля 2014 г.

Entity Framework и транзакции

При использовании баз данных в проектах чуть более сложных, нежели простенький сайт на пару страниц, рано или поздно встает проблема использования транзакций. Если же вы решили использовать Entity Framework, то, до выхода EF6 стандартного механизма управления транзакциями в Entity Framework не существовало.  Теперь же, у свойства контекста Database появился метод BeginTransaction(). Используется от вот так.

using (var context = new YourDBContext())
{
   using (var tran = context.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
   {
     try 
     {
           /..../
           tran.Commit();
     }     
     catch
     {
           tran.Rollback();
     }        
   }
}

Есть вариант BeginTransaction() и без явного указания уровня изоляции, при использовании которого используется уровень изоляции по умолчанию для источника данных. Соответственно, все что находится в блоке using включается в транзакцию. Причем, включаться то оно, включается, но вот откатывать или коммитить транзакцию - это ваша обязанность. Автоматически при выходе из using ничего не происходит.

Ну а если вы используете предыдущие версии Entity Framework, то можно использовать делать так: подключаете сборку System.Transactions и используете класс TransactionScope.

using (var scope = new TransactionScope(TransactionScopeOptions.Requires, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
   {
      try
      {
          /..../
          scope.Complete();
      }
      catch
      {

      }
   }


В этом случае, при выходе из using транзакция автоматически откатывается. И, кстати, TransactionScope поддерживает распределенные транзакции, для чего, правда, нужно настраивать на всех машинах где исполняется код или находятся базы данных Distributed Transaction Coordinator.

2 комментария:

  1. Подскажите, вы не смотрели курс Шевчука по C# ? - http://itvdn.com/ru/video/csharp-for-professional-renewed
    Стоящий?

    ОтветитьУдалить
    Ответы
    1. Честно говоря, нет. Даже не знал о существовании Itdvn до вашего вопроса, но, судя по списку тем да, вполне достойно.

      Удалить