SQL Server-聚焦SNAPSHOT基于行版本隔离级别详解(三十)

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

前言

上一篇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隔离级别的过程描述,总算是明白了基于行版本隔离级别的原理。





本文转自Jeffcky博客园博客,原文链接:http://www.cnblogs.com/CreateMyself/p/6361825.html,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
11月前
|
SQL 存储 PHP
解决高版本laravel/framework中SQLServer2008分页报错问题
【11月更文挑战第15天】在高版本的Laravel框架中,使用SQLServer 2008数据库进行分页操作时可能会遇到兼容性问题,导致报错。本文提供了两种解决方案:一是升级数据库版本至2012或更高,以提高对复杂查询的支持;二是通过自定义分页查询构建器,手动调整分页逻辑,使其适应SQLServer 2008的特性。具体实施步骤包括备份数据、安装新数据库版本、恢复数据,或创建自定义分页查询类并在模型中使用。这些方法能有效解决分页报错问题。
116 3
|
11月前
|
SQL PHP 数据库
解决高版本laravel/framework中SQLServer2008分页报错问题
【11月更文挑战第6天】在高版本的 `laravel/framework` 中使用 SQL Server 2008 进行数据库操作时,可能会出现分页报错。这是由于 `laravel` 的分页机制与 SQL Server 2008 的某些特性不兼容所致。解决方法包括:1. 升级数据库版本;2. 自定义分页查询语句;3. 使用兼容包或插件;4. 修改 `laravel` 的分页逻辑。
116 3
|
12月前
|
SQL 监控 测试技术
SQL现在到哪个版本及版本更新技巧与方法
SQL(Structured Query Language)作为数据库管理和操作的标准语言,随着技术的不断进步和数据库管理系统(DBMS)的持续发展,其版本也在不断更新和完善
1030 5
|
12月前
|
SQL Oracle 关系型数据库
SQL数据库当前版本概览与更新趋势
在探讨SQL(Structured Query Language)数据库的当前版本时,我们首先要明确的是,SQL本身是一种查询语言标准,而并非特指某一个具体的数据库产品
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
11月前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
139 0
|
SQL 数据管理 BI
SQL 有哪些版本?
SQL 有哪些版本?
1025 4
|
SQL 数据管理 BI
SQL Server 有哪些版本?
SQL Server 有哪些版本?
825 3
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
185 6

热门文章

最新文章