实体框架事务代码块

时间:2018-01-08 15:44:45

标签: entity-framework entity-framework-6 transactionscope distributed-transactions

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

所以假设我正在使用......

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绑定的东西来减少我的超时,并保持事务处理我关心的位(数据连续性)。

1 个答案:

答案 0 :(得分:0)

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