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

时间:2010-08-12 12:27:12

标签: sql-server

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

4 个答案:

答案 0 :(得分:45)

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

来自MSDN regarding SET TRANSACTION ISOLATION LEVEL

  

<强> SERIALIZABLE

     

在数据集上放置范围锁定,   阻止其他用户更新   或将行插入数据集   直到交易完成。   这是最严格的   四个隔离级别。因为   并发性较低,请使用此选项   只在必要时。这个选项有   与设置HOLDLOCK的效果相同   所有SELECT语句中的所有表   交易。

因此,您的事务在其整个生命周期内保持所有锁定 - 即使是在使用后通常丢弃的锁定这使得所有事务似乎一次运行一个,因此名称为SERIALIZABLE。来自Wikipedia regarding isolation levels的注释:

  

<强> SERIALIZABLE

     

此隔离级别指定了   所有交易完全发生   孤立的时尚;即,好像全部   系统中的交易有   连续执行,一个在后   其他。 DBMS可以执行两个或   同时进行更多交易   只有串行的错觉   执行可以保持。

答案 1 :(得分:3)

尝试会计。如果您希望拥有适当的帐户值并遵守信用限额等事项,则帐户中的交易本身就是可序列化的。

答案 2 :(得分:0)

SERIALIZABLE隔离级别是基于pessimistic concurrency control的最高隔离级别,其中事务完全相互隔离。

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

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

和Microsoft documentation扩展了以下两个:

  • 丢失更新
  • 由于行更新导致的丢失和重复读取

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

enter image description here

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

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

此外,有关Transaction Locking and Row Versioning Guide的官方文档也是讨论和解释许多方面的好地方。

答案 3 :(得分:0)

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