我知道Serializable的隔离级别是所有隔离级别中限制最多的。我很好奇什么样的应用程序会需要这种级别的隔离,或者我什么时候应该考虑使用它?
发布于 2010-08-12 21:47:06
问你自己以下问题:如果有人在你的事务运行时向你的数据中插入一个新行,那会不会很糟糕?这会以一种不可接受的方式干扰你的结果吗?如果是,请使用SERIALIZABLE级别。
来自MSDN regarding SET TRANSACTION ISOLATION LEVEL
可串行化
在数据集上设置范围锁,以防止其他用户在事务完成之前更新行或向数据集中插入行。这是四个隔离级别中限制最多的一个。由于并发性较低,因此仅在必要时使用此选项。此选项与在事务中所有SELECT语句中的所有表上设置HOLDLOCK具有相同的效果。
因此,您的事务在其整个生命周期中维护所有锁--即使那些通常在使用后被丢弃的锁也是如此。这使得所有事务看起来一次只运行一个,因此被命名为SERIALIZABLE。来自Wikipedia regarding isolation levels的注释
可串行化
此隔离级别指定所有事务以完全隔离的方式发生;即,就好像系统中的所有事务一个接一个地连续执行。只有在能够保持串行执行的假象的情况下,数据库管理系统才能同时执行两个或更多事务。
发布于 2010-08-12 20:30:37
试试看会计。如果您希望拥有适当的帐户值并遵守信用额度等内容,则帐户中的事务本质上是可序列化的。
发布于 2018-12-12 03:08:39
SERIALIZABLE隔离级别是基于pessimistic concurrency control的最高隔离级别,其中事务彼此完全隔离。
ANSI/ISO标准SQL92涵盖了当一个事务读取由第二个事务改变的数据时的以下读取现象:
微软的documentation扩展了以下两个功能:
由row updates引起的
下表显示了不同隔离级别带来的并发副作用:

因此,问题是您的业务需求允许哪些读取现象,然后检查您的硬件环境是否可以处理更严格的并发控制?
注意,关于SERIALIZABLE隔离级别有一些非常有趣的事情-它是由SQL标准指定的默认隔离级别。当然,在SQL Server的上下文中,缺省值是READ COMMITTED。
此外,关于Transaction Locking and Row Versioning Guide的官方文档是一个很好的地方,其中涵盖并解释了许多方面。
https://stackoverflow.com/questions/3467613
复制相似问题