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