【问题标题】:Best Isolation Level to avoid deadlocks using an UPDATE sentence in Sql Server 2005在 Sql Server 2005 中使用 UPDATE 语句避免死锁的最佳隔离级别
【发布时间】:2011-03-15 10:56:17
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:
    READ UNCOMMITTED
    

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

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

    【讨论】:

      【解决方案2】:

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

      我不知道那个问题的答案 - 我自己一直在制定一些策略。请参阅this question 的 cmets 进行一些讨论。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 死锁更难遇到,但如果发生冲突,您会遇到大量的 UPDATE 回滚!
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-27
          • 2011-09-13
          • 1970-01-01
          • 2018-06-27
          • 1970-01-01
          • 1970-01-01
          • 2015-06-21
          • 1970-01-01
          相关资源
          最近更新 更多