我开始解决tempdb
我们在 SQL Server 2005 Enterprise Edition 上遇到的问题。开发人员收到tempdb
空间不足的错误。从技术上讲,错误是:
访问数据库“dbname”中表“dbo.inserted”中的版本化行时,事务中止。未找到请求的版本化行。您的 tempdb 可能空间不足。请参阅 BOL,了解如何配置 tempdb 进行版本控制
我查看了中的数据库配置sys.databases
,发现以下设置:
snapshot_isolation_state: 0
snapshot_isolation_state_desc: OFF
is_read_committed_snapshot_on: 1
我查了一下这在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。已提交读隔离级别下的读操作基于快照扫描,不获取锁。
0 = READ_COMMITTED_SNAPSHOT 选项为 OFF(默认)。已提交读隔离级别下的读操作使用共享锁。
如果我理解正确,snapshot_isolation_state
则为 OFF 且不允许。但是,1is_read_committed_snapshot_on
表示数据库正在使用快照隔离。如果不允许,这怎么可能?
正如@AlexKuznetsov 所指出的,
SNAPSHOT
并且READ_COMMITTED_SNAPSHOT
是两个不同的隔离级别。因此,snapshot_isolation_state
表示前者,而is_read_committed_snapshot_on
后者。以下是我发现的一些评论,总结了两者之间的差异:和 ...