问题涉及事务范围和context.SaveChanges()。如果我使用一个foreach处理100万个记录,并且在每次保存之后,比方说,通过在事务范围内调用context.SaveChanges()来保存1000个记录,而在处理了10000个数据和调用了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?
}发布于 2015-08-16 16:16:42
只要注册了DbContext,事务作用域就优先,默认情况下,事务作用域是这样的。
因此,如果您不调用TransactionScope.Complete (例如,因为DbContext-related异常会将您抛出using块之外),那么一切都将如您所期望的那样回滚。我鼓励您简单地尝试一下(最好在侧设置一个分析器来监控到底发生了什么)。
简而言之,每个SaveChanges都会访问数据库,但不会提交。
https://stackoverflow.com/questions/32036488
复制相似问题