2012-06-21 2 views
4

У меня есть такой код:TransactionScope через несколько методов не является ACID?

using (TransactionScope transactionScope = new TransactionScope()) 
     { 
      SetDefaults(products); 

      // Map the SizeCollectionIds of the products 
      _dataAccess.MapProductSizes(products); 

      // Mass update and insert missing parent records to the database 
      _dataAccess.UpdateParents(products); 

      // Get ids of parent products that were newly inserted 
      _dataAccess.PopulateParentProductByParentSku(products); 

      // Insert children into database 
      _dataAccess.InsertProducts(products); 

      // Insert the UPCs into the database 
      _dataAccess.InsertUPCs(products); 

      // Get Product Ids of newly inserted records 
      _dataAccess.PopulateProductIds(products); 

      // Get just the parent products to insert the brands 
      List<ParentProduct> parents = (from prod in products 
              select prod.ParentProduct).Distinct().ToList(); 

      // Insert ParentProductBrand record 
      _dataAccess.InsertParentProductBrands(parents); 

      // Insert the custom attribute records 
      _dataAccess.InsertProductCustomAttributes(products); 

      transactionScope.Complete(); 
     } 

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

+0

Что вы делаете в своих методах доступа к данным? вы должны опубликовать хотя бы один. Если ваши методы доступа к данным верны, то приведенное выше должно работать так, как вы ожидаете. –

+1

Сделка будет откат, если 1) 'ts.Complete()' не вызывается * и * 2) используемые соединения * занесены в * TS. Обратите внимание, что ** уже открытые соединения автоматически не заходят в TransactionScope **. Также убедитесь, что поставщик DA использует TS [правильно], а «half baked» не является результатом побочных эффектов вне поставщика DA. –

+0

(Этот смелый бит очень важен. Некоторые DAL, такие как LINQ2SQL, по умолчанию открывают новые соединения в каждом 'SubmitChanges'. Другие провайдеры могут повторно использовать одно и то же соединение. Знание о провайдере, используемом здесь, и, возможно, пик в DAL - приведет к более полезным ответам.) –

ответ

0

Похоже, что на вашем уровне DataAccess создаются несколько экземпляров соединений с базой данных. Попробуйте создать соединение с базой данных в конструкторе класса DataAccess и использовать его в своих методах DataAccess. Вы можете прочитать this blog post

+1

Нет, мой уровень доступа к данным открывает только одно соединение для всего его существования, но в соответствии с pst сверху он выглядит так, как будто мне нужно создать это соединение ПОСЛЕ создания TransactionScope или соединение не будет знать, какую транзакцию нужно заручиться в – jjm340

+0

Да; это наиболее подходящий подход. Проверьте это обсуждение 'http: // stackoverflow.com/questions/934316/is-there-a-way-to-use-transactioncope-with-an-existing-connection' –

Смежные вопросы