2010-07-13 52 views

回答

8
READ UNCOMMITTED 

但是,允许进程来读数据的事务提交之前,被称为脏读。 Further Reading

您可能更愿意打开行版本控制,更新将创建该行的新版本,并且任何其他选择语句都会使用旧版本,直到此版本已提交。为此,请打开READ_COMMITTED_SNAPSHOT模式。还有更多信息here。有一个开销涉及维护行的版本,但它删除UPDATE/SELECT死锁。

1

研究快照隔离 - 使用此级别的隔离是一致性和速度之间的良好折衷。我可能因为这样说而遭到枪杀,但我相信在这个隔离级别上遇到的僵局要困难得多。

这是否是解决死锁问题的正确方法,完全是另一回事。

+0

死锁更难遇到,但如果发生冲突,您将会发生大量UPDATE回滚! – 2010-07-13 17:31:48

0

使用游标或循环更新批处理中的少量行,这可以避免SQL Server泄露到表锁。

2

在这里使用READ UNCOMMITTED的建议是可以的,但他们确实会侧重解决为什么首先会陷入僵局的问题。如果你不关心脏读,那很好,但如果你需要隔离(一致性等)的好处,那么我建议在你的应用程序中找出适当的锁定策略。

我没有你的答案 - 我一直在自己制定一些策略。有关讨论,请参阅this question的评论。