【问题标题】:Which database isolation we should use for the same , and which isolation level is best?我们应该使用哪种数据库隔离,哪种隔离级别最好?
【发布时间】:2011-01-29 05:20:05
【问题描述】:

在 SQL Server 2005 中,

我有这么多存储过程,有的用事务更新表记录,有的用于获取表记录。

当一个SP在一个更新表记录的过程中调用时,如果我运行另一个SP来获取表数据,那么它应该运行而不等待,我需要做什么?

我们应该为相同的数据库使用哪种隔离,哪种隔离级别最好?

可以使用“transalation 快照隔离级别”。但它会选择 Teampdb 数据库中的旧快照数据,这可能会降低性能。

你有什么建议?

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql


    【解决方案1】:

    READ COMMITTED 是 SQL Server 中的默认事务隔离级别。

    使用任何其他隔离级别(无论如何对我来说)构成了一个code smell——至少对我而言——这需要一些真正的理由,除了有限使用 @ 987654323@ 在某些情况下。

    【讨论】:

    • 把它留在READ COMMITTED,除非你有另一个隔离级别的真正理由。如果您遇到严重的阻塞,您可能需要检查您的交易设计。
    【解决方案2】:

    您应该使用SNAPSHOT 隔离级别。最好的办法是在数据库级别开启 READ COMMITTED SNAPSHOT,它会静默地将所有默认的 READ COMMITTED 事务转换为快照事务。

    SNAPSHOT 最适合应用程序的原因,特别是对于可能因并发问题而遇到阻塞的应用程序,原因不胜枚举,好处无穷无尽。的确,SNAPSHOT 隔离发生cost in resources used,但除非您测量并找到确凿证据表明导致问题的行版本存储,否则您不能提前将其排除。

    一个永远不应该使用的隔离级别是 UNCOMMITTED。那是自找麻烦。 Dirty reads are inconsistent reads.

    REPEATABLE 和 SERIALIZABLE 的用例非常狭窄,您很可能永远不需要它们。不幸的是,SERIALIZABLE 被 .Net System.Transactions 和 MTS/COM+ 滥用,所以很多应用程序最终都使用它(并且因此存在巨大的可伸缩性问题),尽管它不是必需的。

    【讨论】:

      【解决方案3】:

      如果第一个事务更新了某个表中的数据,那么第二个事务无论如何都会等待获取该数据(READ UNCOMMITTED 隔离级别除外,但在这种情况下,您可能会有非常不一致的数据)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-30
        • 1970-01-01
        • 2011-11-19
        • 2015-08-02
        • 2023-04-05
        • 2016-12-29
        • 2022-10-14
        • 1970-01-01
        相关资源
        最近更新 更多