合 MSSQL中的“读提交快照”
Tags: MSSQLSQL Server读提交快照
简介
当数据库中存在大量面积LCK_M_S 共享锁的时候,我们经常会选择使用读提交快照隔离级别。读提交快照处于打开状态(READ COMMITTED SNAPSHOT)设置True,可对查询性能改进带来帮助,避免发生阻塞的情况。
在SQL Server中,用户可以在会话级别或全局级别设置事务隔离级别,甚至可以在查询级别通过特定的提示(如NOLOCK提示)临时改变隔离行为。
从SQL Server 2005开始,就有了READ COMMITTED SNAPSHOT隔离级别(RCSI)和快照隔离级别(SI),即基于行版本的已提交读(Read Committed Snapshot Isolation, RCSI)。当使用这些新的隔离级别时,SELECT语句在阅读过程中不会获得S共享锁。 (UPDATE,DELETE语句)将他们正在更改的记录的旧版本,存入为TempDb。 他们正在创建一个版本链,其中记录的实际版本(存储在数据库中的数据页面上)指向存储在TempDb页面上的旧版本。 下图显示了这个概念。
为了实现上面的功能,SQL Server必须为数据库中的数据页面上的每个记录添加一个14字节长的指针。 这意味着每个记录的长度将延长14字节。 您可能已经知道,当您使用*固定长度*的数据类型时,SQL Server中的记录不能超过8060字节。 这意味着启用RCSI / SI可能导致这些记录大于8060字节。
查询
1 | select d.name,d.is_read_committed_snapshot_on,d.snapshot_isolation_state,d.snapshot_isolation_state_desc from sys.databases d; |
修改
1 2 3 4 5 6 7 8 9 10 11 12 13 | USE [master] GO ALTER DATABASE [db1] SET READ_COMMITTED_SNAPSHOT ON WITH NO_WAIT GO ALTER DATABASE <DatabaseName> SET ALLOW_SNAPSHOT_ISOLATION ON GO ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON ALTER DATABASE dbname SET MULTI_USER WITH ROLLBACK IMMEDIATE |