У меня есть такой код: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, чтобы заставить это работать?
Что вы делаете в своих методах доступа к данным? вы должны опубликовать хотя бы один. Если ваши методы доступа к данным верны, то приведенное выше должно работать так, как вы ожидаете. –
Сделка будет откат, если 1) 'ts.Complete()' не вызывается * и * 2) используемые соединения * занесены в * TS. Обратите внимание, что ** уже открытые соединения автоматически не заходят в TransactionScope **. Также убедитесь, что поставщик DA использует TS [правильно], а «half baked» не является результатом побочных эффектов вне поставщика DA. –
(Этот смелый бит очень важен. Некоторые DAL, такие как LINQ2SQL, по умолчанию открывают новые соединения в каждом 'SubmitChanges'. Другие провайдеры могут повторно использовать одно и то же соединение. Знание о провайдере, используемом здесь, и, возможно, пик в DAL - приведет к более полезным ответам.) –