检查点(Checkpoint)过程如何处理未提交的事务

每次我讲解SQL Server之前,我都会先简单谈下当我们执行查询时,在SQL Server内部发生了什么。执行一个SELECT语句非常简单,但是执行DML语句更加复杂,因为SQL Server要修改内存中的相关页,并在事务日志里记录整个事务。

介绍完这些特定步骤后,我总会问同样的问题:当我们有个未提交的事务,这个时候刚好有检查点(Checkpoint)发生,SQL Server会崩溃么?在我们数据文件里有我们未提交的数据么?先思考下,然后再写下你的答案。

创建测试场景

现在我想和你一起重建这个特定场景,最后你会看到你是否回答对了。这个场景的第一步,我创建了一个新的数据库,一个新的表,并插入一些记录。

 1 -- Create a new database
 2 CREATE DATABASE Checkpointing
 3 GO
 4 
 5 -- Use it
 6 USE Checkpointing
 7 GO
 8 
 9 -- Create a new table
10 CREATE TABLE Foo
11 (
12     Col1 CHAR(100) NOT NULL,
13     Col2 CHAR(100) NOT NULL,
14     Col3 CHAR(100) NOT NULL
15 )
16 GO
17 
18 -- Insert a record
19 INSERT INTO Foo VALUES
20 (
21     REPLICATE('A', 100),
22     REPLICATE('B', 100),
23     REPLICATE('C', 100)
24 )
25 GO
26 
27 -- Retrieve the record
28 SELECT * FROM Foo
29 GO

在我们插入数据后,我想知道SQL Server存储特定记录的页号。我们可以使用DBCC IND命来来返回特定表的所有页。在我的服务器上SQL Server使用的Page id是79。

1 -- Retrieve the first data page for the specified table (columns PageFID and PagePID)
2 DBCC IND(Checkpointing, Foo, -1)
3 GO

现在当我们用DBCC PAGE命令输出页内容时(使用这个命令前,要先启用3604跟踪标记),我们可以看到插入的A,B,C的16进制值。

1 -- Enable DBCC trace flag 3604
2 DBCC TRACEON(3604)
3 GO
4 
5 -- Dump the first data page of the table Customers retrieved by DBCC IND previously
6 DBCC PAGE (Checkpointing, 1,79, 3)
7 GO

现在当我们进行检查点(Checkpoint)过程,并最终杀掉SQL Server会发生什么?未提交的数据会物理写入数据文件么?我们来试验下...

崩溃并恢复SQL Server

现在我们开始一个新的事务,并更新插入记录的第一列。

1 -- Begin a new transaction without committing it...
2 BEGIN TRANSACTION
3 
4 UPDATE Foo
5 SET Col1 = REPLICATE('X', 100)

从代码里你可以看到,我们并没有提交这个事务!它还是待定的,未提交的事务。现在我们打开另一个会话,我们人为进行一次检查点(Checkpoint)过程,并最终关闭SQL Server。

1 -- Execute it in a different session
2 CHECKPOINT
3 GO
4 
5 SHUTDOWN WITH NOWAIT
6 GO

现在你认为未提交的事务已经写入数据文件了么?不确定?我们来找出答案!我们在16进制的编辑器(例如XVI32)里打开数据文件。跳到页号79的开始。在数据文件里,页号是物理偏移量,即页开始的地方——乘上8192字节,因为在SQL Server里页的大小是8kb。因此页79的开始整数偏移量是647168(79*8192).当我们查看hex值时,我们看到了我们未提交的数据。

检查点(Checkpoint)过程不会区分提交和未提交的事务。它只会到缓存管理器(Buffer Manager)索取所有脏页,不管它们事务的状态。

现在我们有不一致,损坏的数据库了么?没有,并不真的是。因为现在当我们启动SQL Server,每个数据库都经过故障恢复阶段,所有没提交的事务都会回滚。当SQL Server启动的时候,我们可以在SQL Server日志里看到这个行为:

小结

检查点(Checkpoint)不会在意你的事务状态。来自缓存池(Buffer Pool)的每个脏页会写入数据页。如果SQL Server崩溃了也没关系,因为故障恢复能恢复你的数据库到完全一致的状态。我希望这篇日志能让你更好的理解检查点(Checkpoint)过程,还有它如何与未提交的事务打交道。

作为家庭作业,你能否留言告诉我,还有哪些情形,SQL Server需要运行故障恢复为你的数据库还原到一致状态。在SQL Server里你知道多少个不同的场景呢?

参考文章:https://www.sqlpassion.at/archive/2016/01/25/how-the-checkpoint-process-deals-with-uncommitted-transactions/

转载于:https://www.cnblogs.com/woodytu/p/5164359.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axure如何导出原件_axure导出_axure怎么导出流程图

摘要 腾兴网为您分享:axure怎么导出流程图,随身行,轻轻家教,钱宝宝,美甲帮等软件知识,以及winrar美化版,九秀直播软件,中医养生平台,酚酞瓜,4399dm,移动硬盘检…

机器学习工作坊 - 计算机视觉

点击上方蓝字关注我们(本文阅读时间:2分钟)活动介绍四月的 MS Learn 学堂,我们将进入机器学习专题。 本月三期 MS Learn 学堂,我们会以工作坊的形式,结合具体应用实例,带领大家实践计算机视觉、…

React Native之提示Unable to load script from assets ‘index.android.bundle

1 问题 Unable to load script from assets index.android.bundle. Make sure your bundle is packaged correctly or youre running a packager server. 2 分析 在android的assets目录下面,没有找到index.android.bundle文件 2 解决办法 1) 在app/src/main目录下新建assets…

SQL分组处理气象数据及注意事项

问题:从全国所有气象站点数据气候数据表中(温度,降水量,风速等)找出研究区气象站点及所需气象信息。 解决: select 台站号 as 台站号,年 as 年,降水量 as 降水量,平均气温 as 年均温 from 站点气候年数据 …

服务器硬盘如何验收,系列服务器及存储测试安装验收报告.doc

系列服务器及存储测试安装验收报告p系列UNIX服务器测试安装说明1.测试p系列UNIX服务器系统开关机及系统启动测试目的:系统操作系统是否安装完好,主机能否正常开关机。测试方法:用正常关机手段关闭主机(# shutdown),然后…

arcgis server 无法手动删除切片

背景 问题 场景如下: 切片放置在专门的文件服务器上,通过unc共享路径对外共享。文件服务器的OS为windows server2008R2想手动更新切片服务的切片。发现同一切片服务,有的比例级别文件夹可以删除或者重命名。有的比例级别不可以。不能删除的比…

风变编程python离线版_如何看待风变编程的Python网课

第一次接触Python,其实就是朋友一句话,听说派森挺厉害的,时间大概是两个月前,当时网上搜了下,噢,英文叫Python,一种编程语言,然后就没有然后了... 最近朋友圈偶尔发现有个Python小课…

千寻和省cors精度对比_为什么使用千寻cors服务?它有什么优势?

过去20年,黑白屏手机升级成为智能手机、多数绿皮火车升级成了高铁、数控机床替代了大部分切割工人……科技创新正推动各行业向着便捷、高效、低成本的方向变革。技术升级为商业变革提供巨大动力,商业应用验证技术发展方向。高精度定位将成为公共服务在四…

python exception的传递

try: block except1: except2: ... 如果block中出现了except,那么会先取匹配except1,如果匹配了,进行处理,程序继续执行。 如果except1没有匹配上,那么继续匹配except2。 如果该层的try except都没有匹配到&#xff0c…

Hadoop 2.0 中的资源管理框架 - YARN(Yet Another Resource Negotiator)

1. Hadoop 2.0 中的资源管理 http://dongxicheng.org/mapreduce-nextgen/hadoop-1-and-2-resource-manage/Hadoop 2.0指的是版本为Apache Hadoop 0.23.x、2.x或者CDH4系列的Hadoop,内核主要由HDFS、MapReduce和YARN三个系统组成,其中,YARN是一…

React Native实现js调用安卓原生代码

1 问题 实现js调用安卓原始代码,直接上代码,简单粗暴 2 代码实现 1) 实现一个继承ReactContextBaseJavaModule的类,MyToastModule.java文件如下 public class MyToastModule extends ReactContextBaseJavaModule {public MyToastModule(ReactApplicationContext reactContext)…

Matlab三种归一化方法

归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)…

发布nuget包的正确姿势---cicd自动打包发布

最轻便的发布nuget包方式,方便cicd自动打包发布nuget包首先新建项目项目名随便取,这里就叫它GuiH.ClassLibrary默认即可,需要改目标版本时,等创建好再改项目创建好了随便写个接口方法namespace GuiH.ClassLibrary {public class C…

我的世界服务器物品属性,属性 - Minecraft Wiki,最详细的官方我的世界百科

属性(Attributes)是生物和玩家身上的增益/减益特性系统。属性也存在修饰符(Modifiers)中,用于调整属性的强度。属性应用[]当应用到一个物品,一个物品的修饰符将增加或减少以修正相应的属性下面的命令将给最近的玩家一把增加20( 10)点额外伤害的钻石剑&a…

正则表达式(括号)、[中括号]、{大括号}的区别

正则表达式的() [] {}有不同的意思。 () 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。 (\s*)表示连续空格的字符串。 []是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号。 (0-9) 匹配 0-9′ 本…

分布式和微服务区别_深度解析spring cloud分布式微服务的实现

分布式系统微服务就是原来臃肿的项目拆分为多个模块互不关联。如:按照子服务拆分、数据库、接口,依次往下就更加细粒度,当然运维也就越来越难受了。分布式则是偏向与机器将诺大的系统划分为多个模块部署在不同服务器上。微服务和分布式就是作…

通过Shell开发企业级专业服务启动脚本案例(MySQL)

老男孩教育Linux高端运维班Shell课后必会考试题:企业Shell面试题10:开发企业级MySQL启动脚本说明:MySQL启动命令为:/bin/sh mysqld_safe --pid-file$mysqld_pid_file_path 2>&1 >/dev/null &停止命令逻辑脚本为:mysqld_pidcat …

element vue 上传模板_vue+element 文件上传

一、前言element ui 已经提供了文件上传的组件,直接拿来就能用。具有以下几个特点:限制文件上传的个数,多个文件会发起多个请求。可以设置文件选择后自动上传或者手动触发上传,并且手动触发可以自定义上传逻辑。可以限制文件格式和…

React Native之js调用Android原生使用Callback传递结果给js

如果不清楚js如何调用Android原生,可以先参考我的这篇博客React Native实现js调用安卓原生代码 1 问题 上面的文章只是调用安卓原生显示Toast,但是我们一般会需要调用安卓的代码然后去拿回结果给js,但是我们知道在android层js调用的这个函数返回值必须的void,所以我们需要用到…