1

我需要在 sql server 表上执行更新语句。该表同时被另一个进程使用。因为有时会发生死锁,您建议使用哪种隔离级别来避免或尽量减少这些死锁?

4

4 回答 4

9
READ UNCOMMITTED

但这允许进程在事务提交之前读取数据,这就是所谓的脏读。延伸阅读

您可能更喜欢打开行版本控制,更新会创建行的新版本,并且任何其他选择语句都使用旧版本,直到该版本已提交。为此,请打开 READ_COMMITTED_SNAPSHOT 模式。这里有更多信息。维护行的版本会产生开销,但它消除了 UPDATE/SELECT 死锁。

于 2010-07-13T17:25:21.127 回答
2

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

我没有那个问题的答案——我自己一直在制定一些策略。请参阅此问题的评论以进行一些讨论。

于 2010-07-15T17:35:34.870 回答
1

研究快照隔离——使用这种隔离级别是一致性和速度之间的一个很好的折衷。我可能会因为这样说而被击落,但是我相信在这个隔离级别上更难遇到死锁。

这是否是解决僵局情况的正确做法完全是另一回事。

于 2010-07-13T17:24:16.930 回答
1

使用游标或循环批量更新少量行,这样可以避免 SQL Server 升级为表锁。

于 2010-07-13T17:34:01.840 回答