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

Hos*_*146 40 sql-server

我知道Serializable的隔离级别是所有隔离级别中最严格的.我很好奇,虽然什么样的应用程序需要这种级别的隔离,或者我应该考虑使用它?

Pau*_*ams 49

问自己以下问题:如果有人在您的交易运行时向您的数据插入新行,那会不会很糟糕?这会以不可接受的方式干扰您的结果吗?如果是这样,请使用SERIALIZABLE级别.

来自MSDN关于SET TRANSACTION ISOLATION LEVEL:

SERIALIZABLE

在数据集上放置范围锁定,防止其他用户在事务完成之前更新或将行插入数据集.这是四个隔离级别中最严格的一个.由于并发性较低,因此仅在必要时使用此选项.此选项与在事务中所有SELECT语句中的所有表上设置HOLDLOCK具有相同的效果.

因此,您的事务在其整个生命周期内都会保持所有锁定 - 即使是在使 这使得所有事务似乎一次运行一个,因此名称为SERIALIZABLE.从注维基百科关于隔离级别:

SERIALIZABLE

此隔离级别指定所有事务以完全隔离的方式发生; 即,好像系统中的所有事务都是一个接一个地连续执行.仅当可以维持串行执行的错觉时,DBMS可以同时执行两个或更多个事务.


got*_*tqn 5

隔离SERIALIZABLE级别是基于悲观并发控制的最高隔离级别,其中事务之间完全隔离。

当一个事务读取被第二个事务更改的数据时,ANSI/ISO 标准 SQL 92 涵盖以下读取现象:

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

Microsoft文档扩展了以下两个内容:

  • 丢失更新
  • 行更新导致的漏读和双读

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

在此输入图像描述

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

请注意,有关SERIALIZABLE隔离级别的一些非常有趣的事情 - 它是 SQL 标准指定的默认隔离级别。当然,在 SQL Server 上下文中,默认值是READ COMMITTED.

此外,有关事务锁定和行版本控制指南的官方文档是一个很好的地方,其中涵盖和解释了很多方面。