这些快照隔离级别配置如何在 SQL Server 2005 实例上进行交互?

swa*_*eck 6 sql-server-2005 sql-server isolation-level

我开始解决tempdb我们在 SQL Server 2005 企业版上遇到的问题。开发人员收到tempdb空间不足的错误。从技术上讲,错误是:

访问数据库 'dbname' 中的表 'dbo.inserted' 中的版本化行时,事务中止。未找到请求的版本化行。您的 tempdb 可能空间不足。请参考 BOL 如何配置 tempdb 进行版本控制

我查看了数据库配置sys.databases,发现了以下设置:

snapshot_isolation_state: 0

snapshot_isolation_state_desc: OFF

is_read_committed_snapshot_on: 1
Run Code Online (Sandbox Code Playgroud)

我在BOL 中查找了这意味着什么,主要信息如下:

snapshot_isolation_state

允许快照隔离事务的状态,由 ALLOW_SNAPSHOT_ISOLATION 选项设置:

0 = 快照隔离状态为关闭(默认)。不允许快照隔离。

1 = 快照隔离状态开启。允许快照隔离。

2 = 快照隔离状态正在转换为关闭状态。所有事务都有其修改版本。无法使用快照隔离启动新事务。数据库保持转换为 OFF 状态,直到运行 ALTER DATABASE 时处于活动状态的所有事务都可以完成。

3 = 快照隔离状态正在转换为 ON 状态。新的交易有他们的修改版本。在快照隔离状态变为 1 (ON) 之前,事务无法使用快照隔离。数据库将保持转换到 ON 状态,直到可以完成运行 ALTER DATABASE 时处于活动状态的所有更新事务。

snapshot_isolation_state_desc

允许快照隔离事务的状态描述,由 ALLOW_SNAPSHOT_ISOLATION 选项设置:

  • 离开
  • IN_TRANSITION_TO_ON
  • IN_TRANSITION_TO_OFF

is_read_committed_snapshot_on

1 = READ_COMMITTED_SNAPSHOT 选项为 ON。read-committed 隔离级别下的读操作基于快照扫描,不获取锁。

0 = READ_COMMITTED_SNAPSHOT 选项关闭(默认)。read-committed 隔离级别下的读操作使用共享锁。

如果我正确理解这一点,snapshot_isolation_state则关闭且不允许。但是,1 onis_read_committed_snapshot_on表示数据库正在使用快照隔离。如果不允许,这怎么可能?

swa*_*eck 7

作为@AlexKuznetsov指出,SNAPSHOTREAD_COMMITTED_SNAPSHOT是两个不同的隔离级别。因此,snapshot_isolation_state表示前者,而is_read_committed_snapshot_on后者。以下是我发现的一些评论,总结了两者之间的差异:

READ COMMITTED SNAPSHOT 执行乐观读取和悲观写入。相比之下,SNAPSHOT 执行乐观读取和乐观写入。

~比尔·帕茨克 在这里

和 ...

[READ_COMMITTED_SNAPSHOT] 与 SNAPSHOT 隔离级别的不同之处在于,它不是向读取器提供事务开始时可用的行的最后提交版本(SNAPSHOT ISOLATION),而是读取器获取在以下情况下可用的行的最后提交版本该声明开始(READ_COMMITTED_SNAPSHOT)。

~ Uri Dimant重点是我的),在这里