我一直在寻找一段时间,现在在这里和其他地方,找不到一个很好的答案,为什么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/ –