前言

当数据库中存在大量面积LCK_M_S 共享锁的时候,我们经常会选择使用读提交快照隔离级别,来解决阻塞的问题.但是所有技术都是使用场景的。在下面的场景下,使用读提交快照,就可能出现错误。

正文

从SQL Server 2005开始,我们就有了READ COMMITTED SNAPSHOT隔离级别(RCSI)和快照隔离级别(SI)。当使用这些新的隔离级别时,SELECT语句在阅读过程中不会获得S共享锁。 (UPDATE,DELETE语句)将他们正在更改的记录的旧版本,存入为TempDb。 他们正在创建一个版本链,其中记录的实际版本(存储在数据库中的数据页面上)指向存储在TempDb页面上的旧版本。 下图显示了这个概念。
为了实现上面的功能,SQL Server必须为数据库中的数据页面上的每个记录添加一个14字节长的指针。 这意味着每个记录的长度将延长14字节。 您可能已经知道,当您使用固定长度的数据类型时,SQL Server中的记录不能超过8060字节。 这意味着启用RCSI / SI可能导致这些记录大于8060字节。 让我们来看一个非常简单的例子
USE master
GO-- Create a new database
CREATE DATABASE VersionStoreRestrictions
GO-- Enable RCSI
ALTER DATABASE VersionStoreRestrictions SET READ_COMMITTED_SNAPSHOT ON
GO-- Use it
USE VersionStoreRestrictions
GO-- Create a table where each record is 8047 bytes large
CREATE TABLE TableB
(Column1 CHAR(40),Column2 CHAR(8000)
)
GO

从前面的代码中可以看到,我创建了一个表CHAR类型,加起来长度为8040字节。对于每个记录,SQL Server内部需要至少7个字节的开销。在这种情况下,一行记录需要8047字节的数据页。因为我们在数据库级别上启用了RCSI,所以SQL Server必须为行版本指针添加额外的14个字节,将表中的每个记录扩展到8061个字节。这意味着每个记录对都会超出SQL Server 规定的8060 (1 byte)
首先,我们将一个记录插入到表格中
-- Insert a initial row
INSERT INTO TableB VALUES (REPLICATE('A', 40), REPLICATE('A', 8000))
GO

然后,执行下面的update
UPDATE TableB
SET Column1 = REPLICATE('B', 40)
GO

Msg682,Level22,State214,Line2
Internalerror.Bufferprovidedtoreadcolumnvalueistoosmall.RunDBCCCHECKDBtocheckforanycorruption.

这是一个内部错误,因为SQL Server使用的缓冲区只有8060字节大,现在我们尝试存储在缓冲区8061字节 - SQL Server 2008上还可以重现。 有趣的是,SQL Server Denali CTP1(就是SQL Server 2012)已经修复了这个错误,其中页面转储显示SQL Server存储预期的8061字节。
当您为现有数据库启用RCSI / SI时,请记住这个错误,因为这意味着RCSI / SI不是在任何场景都适用。 当您的数据库中有一个超过8046字节限制的表格时,您将遇到真正的麻烦

总结

除了上述问题,读提交快照还会增加tempdb的压力。这也是需要考虑的一个因素。

SQL Server读提交快照隔离级别的注意事项相关推荐

  1. SQL Server 2005数据库快照

    SQL Server 2005数据库快照 -------------------------------------------创建数据库DemoDB create database DemoDB o ...

  2. 使用SQL Server发布数据库快照遇到错误:对路径”xxxxx“访问被拒绝的解决方法...

    2019独角兽企业重金招聘Python工程师标准>>> 使用SQL Server发布数据库快照的配置中,如果你选择了使用SQL Server代理,而SQL Server代理服务使用的 ...

  3. SQL Server实例的十大安全注意事项

    SQL Server is one of the world's leading data platforms. It is being broadly used hosting millions o ...

  4. SQL Server使用sp_rename重命名约束注意事项

    SQL Server使用sp_rename重命名约束注意事项 在SQL Server中,我们可以使用sp_name这个系统存储过程重命名数据库中对象的名称. 此对象可以是表. 索引. 列. 别名,约束 ...

  5. SQL Server中的快照隔离

    介绍 (Introduction) In this article, I'll explore the use of snapshot isolation using row versioning a ...

  6. SQL Server 2008 数据库快照

    数据库快照大家都知道吗?是不是有很多人没深入研究过呀.那么我们就来动手实验一下Sql Server 2008 的数据库快照功能吧! 首先,先来简单介绍一下数据库快照. 数据库快照其实也是一个数据库,不 ...

  7. SQL Server 创建数据库快照

    创建数据库快照: 必须在create database 命令中包括源数据库的每一个数据文件,原始逻辑名,新物理名与路径, 不能指定其他属性 create database db_snapshot_na ...

  8. SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON

    对于语句的运行,除了执行计划本身,还有一些其他因素要考虑,例如语句的编译时间.执行时间.做了多少次磁盘读等. 如果DBA能够把问题语句单独测试运行,可以在运行前打开下面这三个开关,收集语句运行的统计信 ...

  9. U9在SQL Server上的性能优化经验(转述) — 之 行版本快照

    此文根据用友的文档<基于SQL Server 2008构建SOA大型管理软件技术实践>"翻译"而成,非原创.在baidu上看见此文,觉得写的很好,就将原先的PPT细化一 ...

最新文章

  1. 5GS 协议栈 — N2 接口的协议栈(NGAP/N2-SM)
  2. 浅析Memcache和Redis
  3. Fedora 11-Alpha试用手记
  4. jQuery Zoom 图片聚焦或者点击放大A plugin to enlarge images on touch, click, or mouseover
  5. 物体检测的过去、现在和未来
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的药店门店管理系统
  7. java安装选择哪个可选功能_java章节习题及期末考试题答案.doc
  8. 读大道至简第五章有感
  9. 【路径规划】基于matlab GUI蚁群算法求解机器人栅格地图最短路径规划问题【含Matlab源码 927期】
  10. STM8 内部flash
  11. mtk手机的联机方法
  12. vue+element+上传图片插件
  13. 【Python实现】微信防撤回
  14. Spring 事务研磨
  15. 【Motif Discovery with Missing Data】
  16. ESP8266模块三种低功耗睡眠模式
  17. “奔驰车主哭诉维权”续:双方再次协商无果
  18. 读书笔记:《次第花开》
  19. 笔记:计时器和空闲处理
  20. 程序员的另面爱好(四)

热门文章

  1. 18年西工大硕士研究生入学考试复试机试解答
  2. 极限编程的幻想与真实
  3. vue2+element ui
  4. 提升串口服务器的稳定性,带DTU功能的十六串口服务器
  5. 基于MATLAB和python输出曼德勃罗集
  6. windows用alist部署webdav服务挂载阿里云盘,再用rclone将阿里云盘挂载到电脑本地
  7. 请问函数f(x)=sinh(x)的特性。
  8. 有点意思:不患寡而患不均,不患贫而患不安
  9. import tensorflow as tf ... NameError: name ‘name‘ is not defined
  10. Matlab安装Simulink Support Package for Arduino Hardware和Matlab Support Package for Arduino Hardware说明