Entity Framework 事务代码块

3

我正在运行一些复杂的程序,试图减少某些交易所需的时间,因为它们似乎已经超时,但我不确定做出以下更改的影响。

假设我正在使用...

var scope = new TransactionScope(
   TransactionScopeOption.Required, 
   DefaultTransactionOptions, 
   TransactionScopeAsyncFlowOption.Enabled
);

Sample 1:

using (scope)
{

   // get stuff from multiple db's
   // make a bunch of changes to entities
   Db1.Savechanges(); 
   Db2.Savechanges();
   scope.Complete();
}

示例2:

   // get stuff from multiple db's
   // make a bunch of changes to entities

using (scope)
{
   Db1.Savechanges(); 
   Db2.Savechanges();
   scope.Complete();
}

这两个东西会做同样的事情吗?

我的直觉告诉我它们应该可以,但是如果我不执行所有CPU绑定的操作并保持对我关心的位(数据连续性)的事务,则可能能够减少超时。

1个回答

0

有一些区别,但对于保存操作没有影响。然而,我认为一旦你声明了作用域,之后的所有内容都将在其范围内。因此,你应该在最后的using语句中声明它。否则,所有的get命令都将在事务范围内,根据设置可能会锁定记录。但是,当涉及到保存调用本身的超时时,没有任何区别,因为超时通常是单个数据库故障,而不是事务范围的总时间。Transaction Scope使用机器配置设置作为最大超时时间。默认的机器超时时间为10分钟。因此,一个db SaveChanges调用本身可能大于默认的30秒连接时间,所以TransactionScope不是问题所在。


我也注意到了超时问题,所以我在代码中声明了一个常量(因为我的所有服务都使用相同的事务选项),并尝试将超时时间设置为1小时,但它似乎仍然在10分钟后超时。这篇文章已经变成了一个XY问题,因为我认为解决方案是“在事务内节省时间”,即不包括所有那些获取调用和其他非数据库相关业务逻辑。 - War
如果您正在使用EF保存大量记录,您可能需要尝试另一种方法。当您超过100条记录时,EF会变得非常缓慢。我经常只创建许多线程,每次保存1条记录,但它们各自创建自己的dbcontext。如果是很多添加操作,我也会考虑批量插入。 - Daniel Lorenz
嗨丹尼尔,抱歉耽搁了,我被拉到其他事情上了。你有什么想法,如何在没有EF的情况下对对象图进行EF样式的批量更新和插入? - War
有第三方Nuget包可以直接为EF添加批量支持,但您也可以通过ado.net使用内置的SQL Server支持。您可以直接使用实体生成所需的Datatable,因为您知道列名和类型。或者您需要创建一个事务并一次保存20个。 - Daniel Lorenz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接