我一直在尋找一段時間,現在在這裏和其他地方,找不到一個很好的答案,爲什麼Linq-TO-SQL與NOLOCK是不可能的。LINQ-TO-SQL NOLOCK(不ReadUncommitted)
每次我搜索如何將(NOLOCK)提示應用於Linq-To-SQL上下文(應用於1個sql語句)時,人們經常會回答強制將IsolationLevel設置爲ReadUncommitted的事務(TransactionScope)。那麼 - 他們很少告訴這導致連接打開一個事務(我也讀過的地方必須確保手動關閉)。
在我的應用程序中原樣使用ReadUncommitted實際上並不好。現在我已經使用上下文語句爲對方內的相同的連接。像:
using(var ctx1 = new Context()) {
... some code here ...
using(var ctx2 = new Context()) {
... some code here ...
using(var ctx3 = new Context()) {
... some code here ...
}
... some code here ...
}
... some code here ...
}
隨着1秒,很多用戶在同一時間,更改隔離級別的總執行時間,將導致上下文等待對方釋放,因爲在連接池中的所有連接的連接正在使用。
因此,改變爲「nolock」的原因之一是避免死鎖(現在我們每天有1個客戶死鎖)。上述的後果只是另一種僵局,並不能解決我的問題。
所以我知道我可以做的是:同一個連接
- 避免嵌套使用在服務器
增加連接池的大小,但我的問題是:
- 這是不可能在不久的將來,因爲許多代碼行重新分解,它會與a (甚至沒有開始評論這是好還是壞)
- 即使這當然會起作用,這就是我所說的「症狀治療」 - 因爲我不知道應用程序將會增長多少,以及如果這是對未來的可靠的解決方案(然後我可能最終得到了很多更多的用戶受到影響一個更糟糕的情況)
我的想法是:
- 那麼它是否真的是真實的, NoLock不可能(對於沒有開始事務的每個語句)?
- 如果1是真的 - 它真的是真的沒有其他人得到了這個問題,並解決它在一個通用的LINQ sql修改?
- 如果2是真的 - 爲什麼這不是別人的問題?
- 有沒有另外的解決辦法,我沒有看過可能?
- 是否使用相同的連接(嵌套)很多次這麼糟糕的做法,沒有人有這個問題?
是*要被nolocked所有*操作?或*一些*?對於* all *,您可以通過'SET'使用連接級別的隔離級別,但是**重要**;在「輝煌」的舉動,隔離級別** IS NOT **不同的使用相同的底層池連接的,之間的復位,所以如果你走這條路線,你需要明確'SET'適當地打開連接 –
之後也:值得一看:http://www.brentozar.com/archive/2011/11/theres-something-about-nolock-webcast-video/ –