【问题标题】:Entity Framework Transaction code blocks实体框架事务代码块
【发布时间】:2018-06-17 15:01:16
【问题描述】:

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

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

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 绑定的事情并为我关心的位(数据连续性)保留事务来减少我的超时。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,我也注意到了超时,所以我声明了一个常量(因为我的所有服务都使用相同的事务选项),因为我尝试将超时设置为 1 小时,但它似乎在 10 小时后仍然超时分钟。这篇文章有点变成了一个 XY 问题,因为我认为解决方案是通过不包括所有那些 get 调用和其他与数据库无关的业务逻辑来“节省事务中的时间”
    • 如果您使用 EF 保存大量记录,您可能需要尝试另一种方法。当您超过 100 条记录时,EF 会减慢速度。我经常只创建许多线程,一次保存 1 条记录,但它们每个都创建自己的 dbcontext。如果添加很多,我也会考虑批量插入。
    • 嗨,丹尼尔,很抱歉我耽误了我做别的事情,知道如何在没有 EF 的情况下进行 EF 样式的批量更新和插入到对象图吗?
    • 有 3rd 方 Nuget 包可以直接向 EF 添加批量支持,但您可以通过 ado.net 为 SQL Server 使用内置的包。您可以直接使用实体来生成它需要的数据表,因为您知道列名和类型。或者你必须创建一个事务,一次只保存 20 个。
    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2017-01-06
    • 2011-03-17
    相关资源
    最近更新 更多