Entity framework 实体框架事务代码块

Entity framework 实体框架事务代码块,entity-framework,entity-framework-6,transactionscope,distributed-transactions,Entity Framework,Entity Framework 6,Transactionscope,Distributed Transactions,我正在运行一些复杂的东西,并试图减少某些事务所花费的时间,因为它们似乎超时了,但我不确定进行以下更改会产生什么影响 所以假设我使用 var scope = new TransactionScope( TransactionScopeOption.Required, DefaultTransactionOptions, TransactionScopeAsyncFlowOption.Enabled ); 样本1: using (scope) { // get stu

我正在运行一些复杂的东西,并试图减少某些事务所花费的时间,因为它们似乎超时了,但我不确定进行以下更改会产生什么影响

所以假设我使用

var scope = new TransactionScope(
   TransactionScopeOption.Required, 
   DefaultTransactionOptions, 
   TransactionScopeAsyncFlowOption.Enabled
);
样本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限制的事情并保留事务以实现我关心的一点(数据连续性)来减少超时时间。

这是有区别的,但不是为了节省时间。然而,我认为,一旦你宣布了范围,未来的一切都将在范围之内。因此,您希望在最后的using语句中声明它。否则,所有get命令都将在事务范围内,可能会根据设置锁定记录。但是,当谈到save调用本身期间的超时时,不会有任何区别,因为超时通常是单个DB故障,而不是事务作用域的总量。事务作用域使用计算机配置设置作为最大超时。默认机器超时为10分钟。因此,其中一个db SaveChanges调用本身可能大于默认的30秒连接,因此TransactionScope不是问题所在。

Yeh我也注意到超时,因此我声明了一个常量(因为我的所有服务都使用相同的事务选项)在这方面,我尝试将超时设置为1小时,但10分钟后似乎仍然超时。这篇文章有点涉及XY问题,因为我认为解决方案是“在事务中节省时间”,不包括所有那些get调用和其他与db无关的业务逻辑。如果您使用EF保存了大量记录,您可能需要尝试另一种方法。当超过100条记录时,EF的速度会减慢。我通常只创建多个线程,一次保存一条记录,但每个线程都创建自己的dbcontext。如果是大量添加,我也会考虑批量插入。嗨,丹尼尔,很抱歉我在其他方面耽搁了时间,你知道我该如何在没有EF的情况下对对象图进行EF风格的批量更新和插入吗?有第三方Nuget软件包可以直接向EF添加批量支持,但是你可以通过ado.net使用内置的SQL server。您可以直接使用实体来生成所需的数据表,因为您知道列名和类型。或者你必须创建一个事务,一次只保存20个。