当前位置: 首页 > news >正文

SQLServer之创建数据库快照

创建数据库快照注意事项

语法:set transaction isolation level snapshot;

指定事务中任何语句读取的数据都将是在事务开始时便存在的数据的事务上一致的版本。 事务只能识别在其开始之前提交的数据修改。 在当前事务中执行的语句将看不到在当前事务开始以后由其他事务所做的数据修改。 其效果就好像事务中的语句获得了已提交数据的快照,因为该数据在事务开始时就存在。

除非正在恢复数据库,否则 SNAPSHOT 事务不会在读取数据时请求锁。 读取数据的 SNAPSHOT 事务不会阻止其他事务写入数据。 写入数据的事务也不会阻止 SNAPSHOT 事务读取数据。

在数据库恢复的回滚阶段,如果尝试读取由其他正在回滚的事务锁定的数据,则 SNAPSHOT 事务将请求一个锁。 在事务完成回滚之前,SNAPSHOT 事务会一直被阻塞。 当事务取得授权之后,便会立即释放锁。

必须将 ALLOW_SNAPSHOT_ISOLATION 数据库选项设置为 ON,才能开始一个使用 SNAPSHOT 隔离级别的事务。如果使用 SNAPSHOT 隔离级别的事务访问多个数据库中的数据,则必须在每个数据库中将 ALLOW_SNAPSHOT_ISOLATION 都设置为 ON。

不能将通过其他隔离级别开始的事务设置为 SNAPSHOT 隔离级别,否则将导致事务中止。 如果一个事务在 SNAPSHOT 隔离级别开始,则可以将它更改为另一个隔离级别,然后再返回 SNAPSHOT。 事务在第一次访问数据时启动。

在 SNAPSHOT 隔离级别下运行的事务可以查看由该事务所做的更改。 例如,如果事务对表执行 UPDATE,然后对同一个表发出 SELECT 语句,则修改后的数据将包含在结果集中。

在快照隔离模式下,事务中任何语句读取的 FILESTREAM 数据都将是在事务开始(而非语句开始)时便存在的数据的事务性一致版本。

使用T-SQL脚本创建数据库快照

第一步:开始一个读取会话和修改会话。

读取会话脚本:

--声明数据库使用
use testss;
go

--开启修改会话
begin transaction updatetran
update test1 set name='数据库快照' where id='1';
waitfor delay '00:00:10';
commit transaction
go

修改会话脚本:

--声明数据库使用
use testss;
go

--创建读取会话
begin transaction readtran
select * from test1 where id='1';
commit transaction;
go

第二步:首先执行读取会话脚本,查看读取结果并记录,方便与快照开启之后读取结果进行对比。

clipboard.png

第三步:修改读取会话脚本。

--声明数据库使用
use testss;
go

--开启数据库快照隔离
--alter database testss set allow_snapshot_isolation on;

--关闭数据库快照隔离
--alter database testss set allow_snapshot_isolation off;

--设置事务隔离级别
set transaction isolation level snapshot;

--创建读取会话
begin transaction readtran
select * from test1 where id='1';
commit transaction;
go

第四步:先执行修改脚本,再执行读取脚本。

修改脚本:依次显示修改脚本执行状态和执行结果。

clipboard.png

clipboard.png

读取脚本:依次显示读取脚本读取状态和读取结果。

clipboard.png

clipboard.png

第五步:结果分析:首先执行修改脚本,在修改脚本执行期间立即执行读取脚本,读取进程没有阻塞,直接读取到了修改事务开始之前的数据,当修改脚本执行完毕之后,再次执行读取脚本,读取进程并未发生阻塞,事务修改完成读取结果和事务修改执行期间读取结果不同,这说明数据库快照只能读取事务开始之前和结束之后的状态。

相关文章:

  • 集成ssm+shiro出现的 问题
  • shell脚本案例分享 - 业务系统日志自定义保留或删除需求
  • 比特币代码分析10 比特币中的工作量
  • Python正则表达式里的单行re.S和多行re.M模式
  • DOM: EVENT FLOW
  • 在windows10上利用Anaconda 搭建python3.6 + tensorflow环境
  • 修复win10无法双击打开txt文档.reg
  • JS的运行机制的总结!
  • 从SQL Server CloudDBA 看云数据库智能化
  • 夯实爪哇基础-数据类型,内存
  • Hibernate关联关系注解配置简单理解
  • 五大好用的开源MySQL管理工具推荐
  • day--42 前端基础小结
  • 【python】【基础】mac安装python3及pip
  • Using system view: sys.sysprocesses to check SqlServer's block and deadlock
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Asm.js的简单介绍
  • bearychat的java client
  • javascript 总结(常用工具类的封装)
  • Linux各目录及每个目录的详细介绍
  • vagrant 添加本地 box 安装 laravel homestead
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 多线程 start 和 run 方法到底有什么区别?
  • 如何解决微信端直接跳WAP端
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​你们这样子,耽误我的工作进度怎么办?
  • "无招胜有招"nbsp;史上最全的互…
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #ifdef 的技巧用法
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (+4)2.2UML建模图
  • (第二周)效能测试
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (杂交版)植物大战僵尸
  • (转)memcache、redis缓存
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net 无限分类
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET文档生成工具ADB使用图文教程
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [20181219]script使用小技巧.txt
  • [2023-年度总结]凡是过往,皆为序章
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [bzoj4240] 有趣的家庭菜园
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型