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. 事务简 ...
随机推荐
- tls session resumption
http://stackoverflow.com/questions/12318325/resume-tls-connection-in-java As long as you use the sam ...
- Git GitHub的使用
Git的工作区示意 GIT总结 使用git github也一段时间突然发现还是少了一些总结,那就从这儿开始吧! (1)git的配置,这儿就从单独的安装配置开始 安装:sudo yum install ...
- iOS开发——Xcode快捷键
1.共用的一些方法 Command + A: 全选Command + C: 复制Command + V: 粘贴Command + X: 剪切Command + Z: 撤销Shift + Command ...
- Markdown及MarkdownPad使用规则
Markdown Markdown 是一种轻量级标记语言.它允许人们"使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档". Markdown语法简要 ...
- java和Ajax
原博(实在太啰嗦了):https://netbeans.org/kb/docs/web/ajax-quickstart_zh_CN.html 1.Ajax的基本原理 Ajax 代表异步 JavaScr ...
- 温故知新 javascript 正则表达式
很长时间没看 正则表达式了,碰巧今天用到,温故知新了一把 看书学习吧 50% 的举一反三练习中的原创. 一 javascript正则表达式的基本知识 1 javascript 正则对象创建 ...
- 用scala实现一个基于TCP Socket的快速文件传输程序
这是用scala实现的一个简单的文件传输程序. 服务端 package jpush import java.io.{DataInputStream, File, FileOutputStream} i ...
- JavaScript 开发工具webstrom使用指南
本文给大家推荐了一款非常热门的javascript开发工具webstrom,着重介绍了webstrom的特色功能.设置技巧.使用心得以及快捷键汇总,非常的全面. 看到网上一篇介绍webstrom的文章 ...
- PHP图片处理之图片背景、画布操作
像验证码或根据动态数据生成统计图标,以及前面介绍的一些GD库操作等都属于动态绘制图像.而在web开发中,也会经常去处理服务器中已存在的图片.例如,根据一些需求对图片进行缩放.加水印.裁剪.翻转和旋转等 ...
- 使IE6下PNG背景透明的七种方法任你选
原文地址:http://blog.csdn.net/mosliang/article/details/6760028 相信如何解决png在ie6下透明的问题困扰了很多人.为了追求更好的页面效果,很多人 ...