【发布时间】:2011-03-15 10:56:17
【问题描述】:
我需要在 sql server 表上执行更新语句。该表同时被另一个进程使用。因为有时会发生死锁,您建议使用哪种隔离级别来避免或尽量减少这些死锁?
【问题讨论】:
标签: sql sql-server-2005 isolation-level database-deadlocks
我需要在 sql server 表上执行更新语句。该表同时被另一个进程使用。因为有时会发生死锁,您建议使用哪种隔离级别来避免或尽量减少这些死锁?
【问题讨论】:
标签: sql sql-server-2005 isolation-level database-deadlocks
READ UNCOMMITTED
但这允许进程在事务提交之前读取数据,这就是所谓的脏读。 Further Reading
您可能更愿意打开行版本控制,更新会创建行的新版本,并且任何其他选择语句都使用旧版本,直到该版本已提交。为此,请打开 READ_COMMITTED_SNAPSHOT 模式。还有更多信息here。维护行的版本会产生开销,但它会消除 UPDATE/SELECT 死锁。
【讨论】:
在此处使用 READ UNCOMMITTED 的建议是可以的,但它们确实回避了您为什么会首先陷入僵局的问题。如果您不关心脏读,那很好,但如果您需要隔离(一致性等)的好处,那么我建议您在应用程序中找出适当的锁定策略。
我不知道那个问题的答案 - 我自己一直在制定一些策略。请参阅this question 的 cmets 进行一些讨论。
【讨论】:
查看快照隔离 - 使用此级别的隔离是一致性和速度之间的良好折衷。我可能会因为这样说而被击落,但我相信在这种隔离级别上更难遇到死锁。
这是否是解决僵局的正确做法完全是另一回事。
【讨论】:
使用游标或循环批量更新少量行,这样可以避免 SQL Server 升级为表锁。
【讨论】: