【问题标题】:Why is Linq query setting my Arithabort options to false?为什么 Linq 查询将我的 Arithabort 选项设置为 false?
【发布时间】:2013-05-07 14:09:13
【问题描述】:

我有这样的代码:

using (var db = new MyDataContext()) {
  db.ExecuteStoreCommand("Set Arithabort on");
  var q = AFairlyComplexQuery(db); // returns an IQueryable<>
  var result = q.ToList();  // Line 4
  return result;
}

我发现此查询超时。我运行 SQL Profiler 并抓取 SQL 并在 SSMS 中运行它,它在 7 秒内返回。根据过去的经验,我了解到这总是由将Arithabort 选项设置为0 引起的,这就是我运行第一个命令的原因。但它仍然超时。

我在第 4 行设置了一个断点。当我遇到断点时,我转到 SSMS,并运行以下查询:

SELECT arithabort, * FROM sys.dm_exec_sessions s
WHERE program_name LIKE 'MyProg%'

正如预期的那样,Arithabort 设置为 1。然后我越过第 4 行,立即返回 SSMS 运行该查询......突然Arithabort 被设置回0

为什么?如何解决这个问题?

编辑:好吧,我找到了一个解决方法,它或多或少是一个答案,但不是很令人满意。

using (var db = new MyDataContext()) {
  db.Connection.Open(); // INSERTING THIS LINE PRESERVES ARITHABORT
  db.ExecuteStoreCommand("Set Arithabort on");
  var q = AFairlyComplexQuery(db); // returns an IQueryable<>
  var result = q.ToList();  // Line 4
  return result;
}

我插入了一行db.Connection.Open()。现在Arithabort 保持其原始值。但这并不能解释 (a) 为什么会这样,以及 (b) 为什么它的运行时间仍然是 SSMS 的大约 10 倍......

【问题讨论】:

  • 你的 MyDataContext 会不会开始一个事务,然后在 Dispose 处结束事务?因此,当某些事情失败时,您的命令将被回滚。
  • @wonko79 - Arithabort 在处理前被重置。
  • 您还尝试在自己的上下文中执行命令,然后在自己的上下文中执行查询。
  • @wonko79 看来无论我做什么,即使是最简单的 Linq 查询,Arithabort 都会隐式重置为 0。在最简单的测试中进行了测试,并且行为是一致的。
  • @wonko79 - 请看我的编辑

标签: c# sql-server linq linq-to-entities sql-server-2012


【解决方案1】:

EF 设置Arithabort 似乎是一个已知问题。并且由于某种原因,ExecuteStoreCommand 不起作用,而以下代码确实起作用:

var cmd = ((EntityConnection)db.Connection).StoreConnection.CreateCommand();
cmd.Connection.Open();
cmd.CommandText = "set arithabort on";
cmd.ExecuteNonQuery();

请参阅this answerthis question 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2011-02-27
    • 2013-12-11
    • 2011-01-28
    相关资源
    最近更新 更多