0

Вопрос относится к области транзакций и context.SaveChanges(). Если я обрабатываю миллион записей с , и я сохраняю после каждого, скажем, 1000 записей, вызывая context.SaveChanges() внутри области транзакции, и что-то не удается после того, как 10 000 были обработаны и вызвал SaveChanges(), уже сохраненные данные будут откатны ? пример:Entity Framework 6, область транзакций, контекст и saveChanges

using(TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew, new TimeSpan(0, 10, 0))) 
{ 
    int counter = 0; 
    using (MyEntities context = new MyEntities()) 
    { 
     foreach(var item in context.Items) 
     { 
      //process item 
      if(counter >= 1000) 
      { 
       context.SaveChanges(); //if fail here, will already saved changes be rolled back? 
       counter = 0 
      } 
     } 
     context.SaveChanges(); 
    } 
    ts.Complete();//what about here? 
} 
+0

Возможно, это всего лишь пример. Но если вы собираетесь сохранить миллион строк, лучше взгляните на более эффективные решения. Например, https://github.com/MikaelEliasson/EntityFramework.Utilities#batch-insertentities (который я поддерживаю) вставляет это в 10 с-20 на достойном компьютере. –

ответ

2

Сделка сфера имеет преимущество, пока DbContext зарегистрирован в нем, что он по умолчанию.

Таким образом, если вы не вызываете TransactionScope.Complete (например, потому что DbContext исключение бросает о связанных вас за пределами using блока), все будет откат, как вы ожидаете. Я рекомендую вам просто попробовать (лучше всего с профилировщиком на стороне следить за тем, что происходит точно).

Одним словом, каждый SaveChanges попадет в базу данных, но не зафиксирует.

+0

, что интересно, вы это говорите. Даже если «откат» не вызывается в транзакции? – Dee

+0

@Dee Когда вы покидаете блок 'using' TS, [' TS.Dispose'] (https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.dispose) называется неявным (это семантика 'use' в C#). Как вы можете видеть в документации, если 'Complete' не был вызван, тогда внешняя транзакция отменяется. Фактически, в [TS] нет метода «Откат» (https://msdn.microsoft.com/en-us/library/System.Transactions.TransactionScope). EF также поддерживает явные транзакции вместо TS, если вы предпочитаете, что иногда рекомендуется по разным причинам. – tne

+0

Это правильный ответ. –