据我所知,Serializable的隔离级别是所有隔离级别中最严格的。我很好奇,虽然什么样的应用程序需要这种级别的隔离,或者我应该考虑使用它?
答案 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扩展了以下两个:
下表显示了由不同隔离级别启用的并发副作用:
因此,问题是您的业务需求允许哪些读取现象,然后检查您的硬件环境是否可以处理更严格的并发控制?
请注意,关于SERIALIZABLE
隔离级别的一些非常有趣的事情-它是SQL标准指定的默认隔离级别。当然,在SQL Server的上下文中,默认值为READ COMMITTED
。
此外,有关Transaction Locking and Row Versioning Guide的官方文档也是讨论和解释许多方面的好地方。
答案 3 :(得分:0)
它的行为方式是,当您尝试更新一行时,它只是阻止更新过程,直到事务完成。