Sql Server2005之后,引入了一个新的隔离级别Snapshot(Read Committed Snapshot Isolation (RCSI))和(Snapshot Isolation (SI))

在之前的Sql Server隔离级别(1)中提到的四种隔离级别,除了Read Uncommitted之外,其他的三个隔离级别都会阻塞其他事务的执行(写锁会阻塞读锁,读锁也会阻塞写锁)。

这样带来的问题是启用这三个隔离级别将会造成性能的损失和并发量的下降,为了提供更好的并发量并且保持一定的数据一致性,Snapshot应运而生。

如果启用了Snapshot隔离,数据库会为提交的数据建立一个版本信息放在tempdb里。当一个事务开始的时候,会先从tempdb中读取最近一次提交的数据版本,这样就避免了读取的操作被写锁阻塞。

所以使用这个隔离级别,会带来更大的硬盘开销。当一个事务运行在Snapshot这个隔离级别下,为了维护版本信息,其他事务对数据的大量更新会导致tempdb中存储的版本信息非常多,不过SQL Server会将当前操作不再需要的版本信息从tempdb中删除。

而开头提到的Read Committed Snapshot Isolation (RCSI)和Snapshot Isolation (SI)都是使用相同的机制来实现数据的版本控制。不过通常会推荐使用Read Committed Snapshot Isolation (RCSI),相比Snapshot Isolation (SI)有如下好处。

1:Read Committed Snapshot Isolation (RCSI)只需要在数据库中开启相应配置即可,不需要改动现有的数据库代码,就可以从默认的Read Committed变成Read Committed Snapshot Isolation,读取操作将不会再被写操作阻塞。而Snapshot Isolation (SI)则需要在一个事务开始之前显示的声明。

2:Read Committed Snapshot Isolation (RCSI)的开销比Snapshot Isolation (SI)小,因为当一条语句结束之后,SQL  Server将不会再为该语句维护行版本信息。而Snapshot Isolation (SI)是对一个事务的声明,对于运行比较久的事务,SQL Server需要在这个期间一直维护版本信息,对应产生的版本数据也就会非常多。

使用这两个隔离级别的方法如下:

Snapshot Isolation (RCSI):

在数据库中打开对应的配置即可

ALTER DATABASE DBNAME
SET READ_COMMITTED_SNAPSHOT ON

Snapshot Isolation (SI):

在数据库中打卡对应的配置,并且需要将一个事务的隔离级别显示声明为Snapshot

ALTER DATABASE DBNAME
SET ALLOW_SNAPSHOT_ISOLATION ON
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
--Statement
END TRAN

本文基本上是对以下文章的理解和翻译,有兴趣的同学可以继续看看原文

http://msdn.microsoft.com/en-us/library/ms188277.aspx

http://www.databasejournal.com/features/mssql/snapshot-isolation-level-in-sql-server-what-why-and-how-part-1.html

http://www.databasejournal.com/features/mssql/snapshot-isolation-level-in-sql-server-what-why-and-how-part-2.html

Sql Server隔离级别(2)的更多相关文章

  1. Sql Server隔离级别(1)

    数据库是一个并发操作的环境,就像多线程一样,这样在高并发的情况下回出现一些问题. 假设我们有一张表Account,表结构和数据如下所示 AccountName Balance jo 100 fo 20 ...

  2. SQL Server 隔离级别(RC&RR)

  3. 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  4. SQL 事务隔离级别

    转载来源:https://www.cnblogs.com/chenmh/p/3998614.html 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务 ...

  5. 【概念原理】四种SQL事务隔离级别和事务ACID特性

    摘要: SQL事务隔离级别和事务的ACID特性 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性.   事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UNCOMMITTED.R ...

  6. (4.12)全面解析-SQL事务+隔离级别+阻塞+死锁

    30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 转自:https://blog.csdn.net/slowlifes/article/details/52752735 2016年10月07日 23 ...

  7. (分享别人的一篇好文章,来自jackson0714)30分钟全面解析-SQL事务+隔离级别+阻塞+死锁()

    30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 阅读目录 概述: 一.事务 二.锁 三.阻塞 四.隔离级别 五.死锁 以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQ ...

  8. 图解 sql 事务隔离级别

    sql 事务隔离级别有四种分种为: 一 Read Uncpommitted(未提交读) 二 Read Committed(提交读) 三 Repeated Read(可重复读) 四 Serializab ...

  9. SQL事物隔离级别

    标准SQL定义了4个隔离级别 Read uncommitted 未提交读 Read committed 已提交读 Repeatable read 可重复读 Serializable 可序列化 基本语法 ...

随机推荐

  1. [系统开发] Python 实现的 Bind 智能 DNS Web 管理系统

    在公司的运营中,DNS还是很重要的,不仅名称解析需要DNS,一些重要的服务,比如负载均衡.HTTP 虚拟主机也会用到它.Bind 手工管理方式有一定的危险性,一旦写错格式就会造成 DNS 服务瘫痪. ...

  2. mysql5.5字符集设置的一点变化(对于中文乱码问题,需要设置mysql字符集)

    工作中因为字符集问题没少头疼,还犯过一次错误,还好拯救及时,没有发生重大事故,唉,弄清楚点还是非常有必要的: 例如我的工作环境为CTR+redhat5+mysql5.5 在导入sql语句的时候必须要注 ...

  3. spring 官方下载地址(Spring Framework 3.2.x&Spring Framework 4.0.x)

    spring官方网站改版后,建议都是通过 Maven和Gradle下载,对不使用Maven和Gradle开发项目的,下载就非常麻烦,下给出Spring Framework jar官方直接下载路径: h ...

  4. (转)RVA-相对虚拟地址解释

    RVA是相对虚拟地址(Relative Virtual Address)的缩写,顾名思义,它是一个“相对”地址,也可以说是“偏移量”,PE文件的各种数据结构中涉及到地址的字段大部分都是以RVA表示的. ...

  5. maven配置多模块项目事例

    limit-parent <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:// ...

  6. 移动web开发,12个触摸及多点触摸事件常用Js插件

    如今移动互联网已经占据了主流地位,越来越多的开发者开始从桌面转向移动平台.与桌面开发不同的是,在移动领域中,不同的操作系统.大量不同屏幕尺寸的移动设备.触摸手势操作等,这都给开发者带来了一定的难度和挑 ...

  7. 移动应用开发测试工具Bugtags集成和使用教程

    前段时间,有很多APP突然走红,最终却都是樱花一现.作为一个创业团队,突然爆红是非常难得的机会.然并卵,由于没有经过充分的测试,再加上用户的激增,APP闪退.服务器数据异常等问题就被暴露出来,用户的流 ...

  8. flume整合kafka

    # Please paste flume.conf here. Example: # Sources, channels, and sinks are defined per # agent name ...

  9. 在 Arch Linux 玩百度 Flash 战曲游戏乱码

    #!/bin/sh #From: http://hi.baidu.com/imtinge/item/3516761d314481542b3e22f0 #Info: CJK Unicode font M ...

  10. c++学习--面向对象一

    类与对象一 一 注意的点 1 利用构造函数给数据成员初始化的两种办法:1 赋值语句,2 用成员初始化列表 解释:1 成员初始化列表的一般形式为: 数据成员名1(初始值1),数据成员名2(初始值2) 2 ...