0
我有这样的代码:为什么Linq查询将我的Arithabort选项设置为false?
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
保持其原始价值。但是,这并不说明(一)这是为什么,和(b)为什么它仍在运行更长的大约10倍它需要在SSMS ...
它可能是你的MyDataContext启动一个事务并在Dispose结束事务?所以当某些事情失败时,你的命令会被回滚。 – wonko79 2013-05-07 14:13:08
@ wonko79 - Arithabort在处置前重置。 – 2013-05-07 14:18:15
你也尝试在自己的上下文中执行命令,然后在自己的上下文中查询。 – wonko79 2013-05-07 14:43:07