SQL Server-聚焦SNAPSHOT基于行版本隔离级别详解(三十)
前言
上一篇SQL Server详细讲解了隔离级别,但是对基于行版本中的SNAPSHOT隔离级别仍未完全理解,本节再详细讲解下,若有疑义或不同见解请在评论中提出,一起探讨。
SNAPSHOT行版本隔离级别
在SNAPSHOT隔离级别下,读取者在读取数据时, 它是确保获得事务启动时最近提交的可用行版本,这意味着,保证获得的是提交后的读取并且可重复读取,以及确保获得不是幻读,类似于SERIALIZABLE级别中一样,但是此隔离级别依赖于行版本,而不是使用共享锁,要想在企业部署的SQL Server实例中允许事务以SNAPSHOT隔离级别工作,首先需要在查询窗口执行以下代码打开快照隔离级别。如下:
ALTER DATABASE TSQL2012 SET ALLOW_SNAPSHOT_ISOLATION ON
下面我们再用一个简单的例子来详细讲解其过程。首先我们启用上述SNAPSHOT隔离级别,然后查询某个表的修改日期列,如下:
ALTER DATABASE AdventureWorks2012 SET ALLOW_SNAPSHOT_ISOLATION ON
GO SELECT
ModifiedDate
FROM HumanResources.Shift GO

如上是我们正常查询出的修改日期列(ModifiedDate)。接下来我们创建两个会话,一个是写入会话(会话一),另外一个是查询会话(会话二)来证明SNAPSHOT隔离级别的作用。
SET TRANSACTION ISOLATION LEVEL SNAPSHOT BEGIN TRAN
UPDATE HumanResources.Shift
SET ModifiedDate = GETDATE() GO
我们设置写入者的隔离级别为SNAPSHOT,然后更新其修改日期为当前日期,但是我们此时只是开启了事务并未提交该写入事务。与此同时我们再来创建一个查询会话(会话二)来查询修改日期列,如下查询会话也未提交事务。
SET TRANSACTION ISOLATION LEVEL SNAPSHOT BEGIN TRAN
SELECT
ModifiedDate
FROM HumanResources.[Shift]

此时我们看到查询出的修改日期依然是原始值并未进行修改,此时我们再来提交写入者事务(会话一),在上述写入者事务后面添加如下一句。
COMMIT TRAN
此时再来在会话二中查询修改日期,结果依然是原始值,如下:

此时我们再来提交查询事务(会话二),再来查询,结果如下

在上一篇仅仅只讲述了最后结果的变化,并未叙述其中过程到底是怎样的,请往下看。
SNAPSHOT基于行版本隔离级别过程叙述
(1)会话一中开启事务并更新修改日期列,但是并未提交会话一中的事务,换句话说,原始值将依然有效,所以SNAPSHOT(快照隔离级别)导致仍然可以读取到原始值。
(2)会话二中开启事务并读取原始值,在这个阶段中,数据库引擎将创建一个读取的行副本到tempdb临时数据库中,所以在会话二中的所有读取事务都将从tempdb临时数据库中读取。
(3)会话一提交了事务并将其修改的值储存到了表中,注意,此时改变的值只是响应到了表中,而会话二中在tempdb临时数据库中副本依然保持不变。
(4)会话二再次读取行时,此时将从tempdb临时数据库中去读取且读取到的依然是原始值,因为在会话二中还并未提交事务。
(5)会话二提交了事务,此时将销毁在tempdb临时数据库中的副本,在此之后将无法再读取原始值。
(6)会话二再次读取行时,因为在提交事务之后在tempdb临时数据库中没有行,所以现在将去表中获取新行。
若我们在上述会话二中查询并未开启事务,这就意味着所有读取将直接从表中读取,同时将不会创建副本到tempdb临时数据库中,进一步讲,此时将导致查询阻塞,所以从这里我们知道开启基于行版本的SNAPSHOT隔离级别将有利于减少死锁情况的发生,提高并发性能。
总结
本节我们再次很详细讲解了基于行版本的SNAPSHOT隔离级别的过程描述,总算是明白了基于行版本隔离级别的原理。
SQL Server-聚焦SNAPSHOT基于行版本隔离级别详解(三十)的更多相关文章
- SQL Server中排名函数row_number,rank,dense_rank,ntile详解
SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...
- SQL Server中通用数据库角色权限的处理详解
SQL Server中通用数据库角色权限的处理详解 前言 安全性是所有数据库管理系统的一个重要特征.理解安全性问题是理解数据库管理系统安全性机制的前提. 最近和同事在做数据库权限清理的事情,主要是删除 ...
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- SQL Server 事务隔离级别详解
标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一 ...
- SQL Server事务、隔离级别详解(二十九)
前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...
- 【转】SQL Server 事务隔离级别详解
SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一定的影响作用. 步骤 事务隔离级别通过影响读操作来间接地影响写操作:可以在回话级别上设置事务隔离级别也可 ...
- SQL Server 中的6种事务隔离级别简单总结
本文出处:http://www.cnblogs.com/wy123/p/7218316.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...
- MySQL Transaction--MySQL与SQL Server在可重复读事务隔离级别上的差异
MySQL和SQL Server两种数据库在REPEATABLE-READ事务隔离级别实现方式不同,导致使用上也存在差异. 在MySQL中,默认使用REPEATABLE-READ事务隔离级别,MySQ ...
- SQL Server-聚焦事务、隔离级别详解(二十九)
前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...
随机推荐
- CodeForces 621A Wet Shark and Odd and Even
水题 #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #inclu ...
- 无限循环小数POJ1930
题意:给定一个无限循环小数,求其分数形势,要求分母最小 分析:看了别人的题解才做出来的,将无限循环小数转化成分数,分为纯循环和混循环两种形式. (1)对于纯循环:用9做分母,有多少个循环数就几个9,比 ...
- SVN第二篇-----命令集合
16.switch 代码库URL变更 svn switch (sw): 更新工作副本至不同的URL. 用法: 1.switch URL [PATH] 更新你的工作副本,映射到一个新 ...
- 乘方快速幂 OR 乘法快速幂
关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就 ...
- 5、手把手教你Extjs5(五)使用图标字体来美化按钮)
sencha 的例子中,有使用图标字体来美化按钮的例子,这个用起来又方便风格又统一,例如下图: 上面图标字体的使用方法也很简单,只要下载Font Awesome的css和图标文件,放到项目里就可以了. ...
- Android L(5.0)源码之开放的图形库接口——OpenGL ES
最近在研究android 5.0的gallery模块,学习了相关的知识点,准备写点博客总结一下,有时间了会补充完整
- 开源免费的C/C++网络库(c/c++ sockets library)补充
(1)ACE 庞大.复杂,适合大型项目.开源.免费,不依赖第三方库,支持跨平台. http://www.cs.wustl.edu/~schmidt/ACE.html (2)Asio Asio基于Boo ...
- 总结分享十大iOS开发者最喜爱的库 分类: ios相关 app相关 2015-04-03 16:43 320人阅读 评论(0) 收藏
该10大iOS开发者最喜爱的库由"iOS辅导团队"成员Marcelo Fabri组织投票选举而得,参与者包括开发者团队,iOS辅导团队以及行业嘉宾.每个团队都要根据以下规则选出五个 ...
- 集群下Cookie共享,必须要设置machineKey
这个节允许你设置用于加密数据和创建数字签名的服务器特定的密钥.ASP.NET自动使用它来保护表单验证Cookie,你也可以将它用于受保护的视图状态数据.同时,这个密钥还用于验证进程外的会话状态提供程序 ...
- Yii实现Password Repeat Validate Rule
在使用Yii时遇到这样的需求:在一个注册的页面输入两次密码,并验证两次输入是否一致.可是password的repeat的字段在数据库 并不存在.问题来了,如何创建一个password_repeat的属 ...