首页 > 数据库 >SQLSERVER 快照隔离级别 到底怎么理解?

SQLSERVER 快照隔离级别 到底怎么理解?

时间:2023-02-05 11:44:41浏览次数:36  
标签:INSERT 快照 隔离 dbo 00000000 INTO SQLSERVER VALUES post

一:背景

1. 讲故事

上一篇写完 SQLSERVER 的四个事务隔离级别到底怎么理解? 之后,有朋友留言问什么时候可以把 snapshot 隔离级别给补上,这篇就来安排,快照隔离级别看起来很魔法,不过在修车之前,得先看下怎么开车。

二:snapshot 隔离详解

1. snapshot 之前的困境

在了解 snapshot 之前先看看没有它会存在什么样的困境?还是用上一篇的 post 表做案例,参考sql 如下。


CREATE TABLE post(id INT IDENTITY,content char(3))
GO
INSERT INTO dbo.post VALUES('aaa')
INSERT INTO dbo.post VALUES('bbb')
INSERT INTO dbo.post VALUES('ccc');
INSERT INTO dbo.post VALUES('ddd');
INSERT INTO dbo.post VALUES('eee');
INSERT INTO dbo.post VALUES('fff');

大家都知道 SQLSERVER 的默认隔离级别是 READ COMMITTED,在下面的场景中 会话2 会被 会话1 阻塞


---- 会话1 ----

BEGIN TRAN
UPDATE post SET content='zzz' WHERE id=1

---- 会话2 ----

BEGIN TRAN
SELECT * FROM post  WHERE id=1;

那如何缓解呢?有一个粗暴的方法就是加 nolock 可以解决这个问题。


BEGIN TRAN
SELECT * FROM post (NOLOCK) WHERE id=1;

但加上 nolock 也不是一种完美的解决方案,如果 会话1 在后续操作中 ROLLBACK 了,那对 会话2 来说就是脏读,那如何解决 既要....又要.... 的问题呢?这就引入了 snapshot 隔离级别,接下来看下怎么玩的。

2. snapshot 的简单使用

要想使用 snapshot 隔离级别,需要打开数据库的 ALLOW_SNAPSHOT_ISOLATION 开关,为了方便测试,我们把数据库 删除重建。


DROP DATABASE MyTestDB
CREATE DATABASE MyTestDB
ALTER DATABASE MyTestDB  SET ALLOW_SNAPSHOT_ISOLATION ON
USE MyTestDB
CREATE TABLE post(id INT IDENTITY,content char(3))
GO
INSERT INTO dbo.post VALUES('aaa')
INSERT INTO dbo.post VALUES('bbb')
INSERT INTO dbo.post VALUES('ccc');
INSERT INTO dbo.post VALUES('ddd');
INSERT INTO dbo.post VALUES('eee');
INSERT INTO dbo.post VALUES('fff');

然后重新跑一下刚才的会话,在会话2的执行中设置快照隔离级别,参考 sql 如下:


SET TRAN ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
SELECT * FROM post  WHERE id=1;

从图中看果然解决了 既要 .... 又要 的问题,既没有阻塞,也没有脏读,

标签:INSERT,快照,隔离,dbo,00000000,INTO,SQLSERVER,VALUES,post
From: https://www.cnblogs.com/huangxincheng/p/17093102.html

相关文章

  • SQLServer数据库导出指定表里所有数据成insert语句
    以sqlserver2008R2,数据库是Northwind数据库为例,导出指定表所有数据的sql脚本目标:把Northwind数据库的Orders表导出成insert语句。1.选择Northwind数据库,右键-任务-......
  • SqlServer2008R2 sqltext的参数化处理
    sqlserver的缓存包括Datacache和Plancache,其中Plancache包括上一篇生成的xml结构和sqltext,sqltext还可以做到参数化,也就是模板化了。1.sql参数化(1).先来做一个Person......
  • SqlServer服务中利用触发器对指定账户进行登录ip限制提升安全性
    转眼间上次写文章已经是2022年12月15日的事情啦,本来从2022年7月份开始写作之后保持着每周一篇,然而从12月15日后断更了这么久,经历了,隔离、阳、过年、从今天开始继续坚持写......
  • OpenHarmony标准系统内核学习【2】CPU轻量级隔离特性
    (目录)CPU轻量级隔离特性基本概念CPU轻量级隔离特性提供了根据系统负载和用户配置来选择合适的CPU进行动态隔离的能力。内核会将被隔离CPU上的任务和中断迁移到其他合......
  • 网络隔离后的数据传输怎么解决?深度解析4种主流方案
    网络隔离对于很多企业来说并不陌生,出于数据安全的考虑,为了隔离有害的网络和可能的网络攻击,越来越多的企业在内部进行了网络隔离。隔离的形态和方式有多种,总体上主要以物理......
  • SqlServer2008R2锁机制
    1.性能低下的update会怎么样?(1).使用原始的person表,插入6条数据,由于是4000字节,所以两条数据就是一个数据页droptabledbo.person;createtableperson(idintidentity,nam......
  • spring事务传播属性和隔离
    REQUIRES_NEW和NESTED的区别REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。​​两个事......
  • ensp:通过配置vlan,实现相同vlan之间的通信和不同vlan之间的隔离。
    实验描述实验操作1:依次设置好IP地址和子网掩码等2:创建vlan,并且所创建的vlan不能比需要修改的少。3:在每个接口试图下进行access端口的配置4:修改相应端口vlan值,因为默认情况......
  • jenkinsfile与项目做隔离
    @Library('siheng-devops')_pipeline{agent{label'jnlp-slave'}options{timeout(time:200,unit:'MINUTES')gitLabConnection('gi......
  • MySQL隔离级别、锁、SQL优化
    一、事务隔离级别1.1事务-事务是逻辑上的一组操作,要么全部执行,要么全部不执行。-事务(Transaction)是并发控制单位,是用户定义的一个操作序列,这些操作要么都做,要么都不......