【问题标题】:Why is snapshot isolation level off by default?为什么快照隔离级别默认关闭?
【发布时间】:2016-01-26 08:57:03
【问题描述】:

在MS SQL Server中,要运行SNAPSHOT隔离级别的事务,首先需要在数据库级别开启。

我只能假设打开这个标志会带来一些 DBA 需要注意的缺点。但我不知道它们是什么。

为什么默认不开启?

PS。注意我说的不是READ_COMMITTED_SNAPSHOT 版本的READ COMMITTED 隔离级别。

【问题讨论】:

  • @Damien_The_Unbeliever 哎呀。固定。

标签: sql-server snapshot-isolation


【解决方案1】:

费用在Choosing Row Versioning-based Isolation Levels页面上描述。

有些是:

  • 当 READ_COMMITTED_SNAPSHOT 或 ALLOW_SNAPSHOT_ISOLATION 数据库选项为 ON 时,更新和删除特定数据库的事务必须维护行版本,即使没有使用基于行版本控制的隔离级别的事务...

  • 行版本信息需要向数据库行添加 14 个字节。

  • 由于维护行版本所涉及的工作,更新性能可能会变慢...

还列出了其他成本,但无论数据库中的任何事务实际上是否使用基于行版本控制的级别之一,上述成本似乎都适用。

【讨论】:

    【解决方案2】:

    启用快照隔离后,每个更新的行版本 事务在 tempdb 中维护。独特的交易序列 number 标识每笔交易,这些唯一的数字是 记录每个行版本。

    这意味着在每个事务(簿记)的基础上存在额外的计算和存储开销,但是通过添加这个额外的负载,更多的操作可以同时进行——如果它们没有冲突的话。这种形式的“乐观并发”是一种在执行簿记时会产生小的性能损失,让您在发生碰撞时捕捉到,此时您必须解除一个或两个事务。但是,如果没有发生冲突,那么两个事务会同时进行。

    一个糟糕的类比是假设您有两个单独需要 5 秒的事务,因此一个接一个地执行它们总共需要 10 秒。但是,如果你要在每一个上多花一秒钟,你可以同时做这两个。当然现在每个都需要 6 秒(20% 的惩罚),但两者总共需要 6 秒而不是 10 秒。

    如果您没有真正高水平的并发性,让每个事务稍微贵一点可能会浪费资源,因为这会降低您的单个事务吞吐量。因此,您的 DBA 在权衡启用数据库级别时需要考虑这一点,因为它会通过更改存储方式来影响每个事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2010-11-10
      • 2014-09-27
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多