La domanda riguarda l'ambito e il context.SaveChanges()
transazione.SaveChanges context.SaveChanges()
. Se sto elaborando un milione di record con un foreach
, e salvo ogni, diciamo, 1000 record chiamando il context.SaveChanges()
all'interno di un ambito di transazione e qualcosa non riesce dopo che sono stati elaborati 10.000 e chiamato SaveChanges()
i dati già salvati devono essere ripristinati? esempio:
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?
}
L'ambito della transazione ha la precedenza fintanto che DbContext
è registrato in esso, che è per impostazione predefinita.
Pertanto, se non si chiama TransactionScope.Complete
(ad es. Perché un'eccezione DbContext
a DbContext
ti lancia all'esterno del blocco using
), tutto verrà eseguito il rollback come previsto. Ti incoraggio a provarlo semplicemente (meglio con un profiler sul lato per monitorare esattamente cosa sta succedendo).
In breve, ogni SaveChanges
colpirà il database, ma non eseguirà il commit.