2015-06-18 3 views
2

Я использую TransactionScope откатить транзакцию, потерпеть неудачуTransactionScope не откат хотя и не полный() называется

bool errorReported = false; 
Action<ImportErrorLog> newErrorCallback = e => 
{ 
    errorReported = true; 
    errorCallback(e); 
}; 

using (var transaction = new TransactionScope()) 
{ 
    foreach (ImportTaskDefinition task in taskDefinition) 
    { 
     loader.Load(streamFile, newErrorCallback, task.DestinationTable, ProcessingTaskId); 
    } 
    if (!errorReported) 
     transaction.Complete(); 
} 

Я уверен, что нет TransactionScope начал вперед или после этого кода. Я использую структуру сущности для вставки в мою БД.

Независимо от состояния errorReported транзакция никогда не откатывается в случае ошибки.

Что мне не хватает?

+0

Если вы решили, что этот блок должен быть его собственной транзакцией, независимо от внешней транзакции, вы можете сделать «новый TransactionScope (TransactionScopeOption.RequiresNew)» – Crowcoder

ответ

2

TransactionScope комплекты Transaction.Current. Это все, что он делает. Все, что хочет совершить сделку, должно смотреть на это свойство.

Я считаю, что EF делает это каждый раз, когда соединение открывается по любой причине. Возможно, ваше соединение уже открыто при установке области.

Откройте соединение внутри области или закрепите вручную.

EF имеет другое неприятное «конструктивное решение»: по умолчанию он открывает новое соединение для каждого запроса. Это приводит к детерминированности распределенных транзакций. Обязательно избегайте этого.

+1

Возможно, инъекция зависимостей, которую я использую для загрузки моих заводов, может быть корнем проблема тогда ... Поиск в этом руководстве, спасибо :) – IggY

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