在Sql Server 2005中使用UPDATE语句避免死锁的最佳隔离级别

时间:2010-07-13 17:18:05

标签: sql sql-server-2005 isolation-level database-deadlocks

我需要在sql server表上执行un update语句,此表由另一个进程同时使用。因为有时会发生僵局。您是否建议隔离级别以避免或最小化此死锁?

4 个答案:

答案 0 :(得分:8)

READ UNCOMMITTED

但是,这允许进程在事务提交之前读取数据,即所谓的脏读。 Further Reading

您可能更喜欢打开行版本控制,更新会创建该行的新版本,而任何其他select语句都会使用旧版本,直到此版本提交为止。要执行此操作,请启用READ_COMMITTED_SNAPSHOT模式。还有更多信息here。有一个开销涉及维护行的版本,但它会删除UPDATE / SELECT死锁。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

查看快照隔离 - 使用此级别的隔离是一致性和速度之间的良好折衷。我可能会因此而被火上浇油,但我相信在这种隔离级别遇到的死锁要困难得多。

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

答案 3 :(得分:0)

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