代码之家  ›  专栏  ›  技术社区  ›  Hosea146

隔离级别-可序列化。我什么时候用这个?

  •  37
  • Hosea146  · 技术社区  · 14 年前

    3 回复  |  直到 8 年前
        1
  •  64
  •   Paul Williams    8 年前

    问自己以下问题:如果有人在事务运行时向您的数据中插入新行,会不会很糟糕?这会以一种不可接受的方式影响你的结果吗?如果是,请使用可序列化级别。

    MSDN regarding SET TRANSACTION ISOLATION LEVEL :

    对数据集设置范围锁, 阻止其他用户更新 或者在数据集中插入行 直到交易完成。 这是最严格的限制 并发性较低,请使用此选项 只有在必要的时候。此选项具有 与HOLDLOCK设置效果相同 中所有SELECT语句中的所有表 交易。

    因此,您的事务在其整个生命周期中维护所有锁——甚至是那些通常在使用后丢弃的锁。这使得所有事务似乎一次运行一个事务,因此名称为SERIALIZABLE。来自的注释 Wikipedia regarding isolation levels

    可序列化

    此隔离级别指定 所有的交易都发生在一个完全不同的环境中 孤立的方式;i、 好像所有的 系统中的事务 一个接一个地连续执行 同时进行更多交易 只有连续的幻觉 可以保持执行。

        2
  •  3
  •   OtherDevOpsGene    10 年前

    试试会计。如果您想拥有适当的帐户值并遵守诸如信用限额之类的规定,那么帐户中的事务本质上是可序列化的。

        3
  •  3
  •   gotqn user3521065    6 年前

    这个 SERIALIZABLE 隔离级别是基于 pessimistic concurrency control 交易完全相互隔离。

    • 脏读
    • 不可重复读取
    • 幻影读

    和微软 documentation 扩展为以下两个:

    • 丢失的更新

    下表显示了不同隔离级别启用的并发副作用:

    enter image description here

    所以,问题是您的业务需求允许哪些读取现象,然后检查您的硬件环境是否可以处理更严格的并发控制?

    注意,关于 可序列化 READ COMMITTED .

    另外,关于 Transaction Locking and Row Versioning Guide 是一个伟大的地方,很多方面都涵盖和解释。

        4
  •  0
  •   Express Coding    5 年前

    它的行为方式是,当您尝试更新一行时,它只是阻止更新过程,直到事务完成。