SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Server数据库是通过什么机制来判断处理呢? 估计很多人跟我一样都有不少疑问, 我们下面构造一个测试实验来测试验证一下。如下所示:

步骤1:在客户端连使用SSMS工具连接到测试数据库,执行下面脚本,显性事务既不提交也不回滚。模拟事务正在执行当中。

USE AdventureWorks2012:在测试服务器上开启Profiler跟踪一下具体信息。具体步骤略过。

步骤3:通过VMware vSphere Client的控制台连接到测试服务器,禁用网卡,然后启用网卡,模拟网络异常。(注意:玩过Vmware的应该都知道,这里不详细介绍!)

如下截图所示,在跟踪过程中,我们可以看到当我构造网络异常时,会话ID=59的事务立即回滚了。

当然你也可以使用下面函数查看日志里面的相关记录信息。如下所示:

SELECT 秒。如下截图所示

事务开始时间为: 2017-07-27 13:48:01:820

事务回滚时间为: 2017-07-27 13:48:32.043

这个是服务器上Keep Alive参数控制的,具体位置 “SQL Server Configuration Manager”->  “SQL Server Network Configuration” ->  "Protocol for MSSQLSERVER" ->  "TCP/IP " 右键单击属性,如下截图所示:

30000 的单位是毫秒, 等价于30秒, 如果你将这个设置为60000 ,那么测试结果就会是60秒或超过60秒。

当然这个时间差是你断开网络的时间和事务结束的时间差,而不是事务开始时间与结束时间差,如下测试所示,截图1,由于需找到禁用网络的位置,然后又切换窗口,导致延误了几秒,这个事务开始、结束时间差为70秒。 当然这个值不可能完全等于Keep Alive的值,因为还涉及参数Keep Alive Interval的值,所以这个值玩玩是大于等于Keep Alive的值。具体后面会讲述!

2: SQL Server通过什么机制来判断当前会话遭遇了网络异常?

在这篇“ORACLE的Dead Connection Detection浅析”文章里面, 我介绍了Linux系统下TCP KeepAlive概念,顾名思义,TCP keepalive它是用来保存TCP连接的,注意它只适用于TCP连接。系统会替你维护一个timer,时间到了,就会向remote peer发送一个probe package,当然里面是没有数据的,对方就会返回一个应答,这时你就知道这个通道保持正常。与TCP keepalive有关的三个参数tcp_keepalive_time、tcp_keepalive_intvl、tcp_keepalive_probes

/proc/sys/net/ipv4/tcp_keepalive_time       当keepalive起用的时候,TCP发送keepalive消息的频度。默认是2小时。

/proc/sys/net/ipv4/tcp_keepalive_intvl      当探测没有确认时,keepalive探测包的发送间隔。缺省是75秒。

/proc/sys/net/ipv4/tcp_keepalive_probes    如果对方不予应答,keepalive探测包的发送次数。缺省值是9。

其实在Windows系统中也有类似的参数,分别是KeepAliveTime、KeepAliveInterval、TcpMaxDataRetransmissions

KeepAliveTime               默认是7,200,000 milliseconds = 2 hours

KeepAliveInterval           默认是1,000 milliseconds = 1 second

TcpMaxDataRetransmissions   默认值是5次

https://technet.microsoft.com/en-us/library/cc957549.aspx

https://technet.microsoft.com/en-us/library/cc957548.aspx

https://technet.microsoft.com/en-us/library/cc938210.aspx

根据上面文档描述,几个值可以在HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters里设置,但是我检查过Windows 2000/2003/2008/2012  默认情况下,在注册表里面都没有这个值,但是可以在注册表里添加该选项。当然好像在有些操作系统下,有些参数是硬编码值,“Important note: If OS is Windows Vista/2008, the number of TCP Keepalive attempts are hardcoded to 10 and could not be adjusted via the registry.” 。 具体参考下面链接,当然这些值个人没有测试过。

https://blogs.technet.microsoft.com/nettracer/2010/06/03/things-that-you-may-want-to-know-about-tcp-keepalives/

那么SQL Server是否也是通过OS的这三个参数来判断会话是否orphaned, 很显然不是。它是通过SQL Server的Keep Alive、Keep Alive Interval来判断会话是否遭遇网络异常。那么操作系统的KeepAliveTime跟SQL Server的Keep Alive是不是一回事? 又有什么区别呢? 其实这个可以参考https://blogs.msdn.microsoft.com/apgcdsd/2011/05/02/sql-server-connection-keepalive-faq/。摘抄部分原文如下:

1、什么是SQL Server TCP连接的Keep Alive?

简单说,keep alive 是SQL server在建立每一个TCP 连接的时候,指定了TCP 协议的keepaliveinterval 和keepalivetime参数。这样对每个TCP连接,如果该连接空闲时间(没有任何数据交互)超过keepalivetime,TCP协议会自动发出keepalive 包检测连接存活与否。如果keepalive检测次数超过注册表TcpMaxDataRetransmissions定义的值而对方还是没有回应,那么TCP就认为该连接有问题而关闭它。通过这样的机制SQLserver能够检测出orphaned connection等问题。

SQL  Server 对每个TCP连接缺省指定keep alive 为30秒,keepaliveinterval为1秒。Windows TCP配置的TcpMaxDataRetransmissions缺省是5次。就是说,如果TCP连接idle了30秒,那么TCP会发送第一个keepalive检查。如果失败,那么TCP会每隔1秒重发keepalive 包,直到重发5次。如果第五次检测依然失败,则该连接就被close。所以,一个TCP连接如果出现异常问题,大概在35秒的时候就会被close。的机制SQL server能够检测出orphaned connection等问题。

3、SQL Server的Keepalive 和Windows的TCP协议里面的Keepalive 是一样的吗?

原理一样,但不相互干扰。

Windows 的TCP协议也有keep alive 配置,位置如下:

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

OS的TCP协议的keep alive 和SQL server 的keep alive 工作原理一样的,就是在建立TCP连接的时候指定TCP连接的keepalive属性(参见后面描述)。但是SQL

server读取自己注册表的keep alive来设置TCP连接属性,不理会windows OS的注册表里面的keepalivetime和keepaliveinterval的值。如果一个应用程序没有显式调用函数设置TCP连接的keepalive属性,那么他的TCP连接默认使用OS 的TCP配置。OSkeep alive配置默认是关闭的。

参考资料:

 

https://blogs.msdn.microsoft.com/sql_protocols/2006/03/08/understand-special-tcpip-property-keep-alive-in-sql-server-2005/

https://blogs.technet.microsoft.com/nettracer/2010/06/03/things-that-you-may-want-to-know-about-tcp-keepalives/

https://blogs.msdn.microsoft.com/apgcdsd/2011/05/02/sql-server-connection-keepalive-faq/

https://blogs.msdn.microsoft.com/apgcdsd/2012/06/07/sql-server-connection-keep-alive-faq3/

SQL Server事务遭遇网络异常时的处理机制浅析的更多相关文章

  1. 网络异常与SQL Server事务

    SQL Server事务遭遇网络异常时的处理机制浅析 SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Se ...

  2. 【SqlServer系列】浅谈SQL Server事务与锁(上篇)

    一  概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章视图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...

  3. SQL Server数据库邮件发送异常案例

      最近遇到两起关于SQL Server数据库邮件发送异常的案例,这些问题也有点意思,顺便记录一下.方便以后遇到类似问题的人参考,不要被这些问题弄得抓狂! 案例1:我们一台数据库服务器突然发送邮件都不 ...

  4. SQL SERVER 事务和锁

    内容皆整理自网络 一.事务 作者:郭无心链接:https://www.zhihu.com/question/31346392/answer/59815366来源:知乎著作权归作者所有.商业转载请联系作 ...

  5. SQL Server 事务复制爬坑记

    SQL Server 复制功能折腾了好几天了,现特将其配置过程以及其间遇到的问题记录下来,以备日后查阅.同时,也让“同道”同学们少走不必要的弯路.如果有不对之处,欢迎大家指正,欢迎沟通交流. 一.复制 ...

  6. SQL Server事务回滚对自增键的影响

    SQL Server事务回滚时是删除原先插入导致的自增值,也就是回滚之前你你插入一条数据导致自增键加1,回滚之后还是加1的状态 --如果获取当前操作最后插入的identity列的值:select @@ ...

  7. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  8. SQL Server 事务复制分发到订阅同步慢

    原文:SQL Server 事务复制分发到订阅同步慢 最近发现有一个发布经常出现问题,每几天就出错不同步,提示要求初始化.重新调整同步后,复制还是很慢!每天白天未分发的命令就达五六百万条!要解决慢的问 ...

  9. 浅谈SQL Server事务与锁(上篇)

    一  概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章试图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...

随机推荐

  1. solr5Ik分词2

    <!--IK分词器--><fieldType name="text_ik" class="solr.TextField"><ana ...

  2. 在64位Ubuntu系统上安装32位程序包

    在64位Ubuntu系统上安装32位的程序包 $sudo apt-get install package_name:i386 例如: $sudo apt-get install openjdk-7-j ...

  3. centos文件权限详解

    假设回显信息为  ①-②rws③r-x④r-x ⑤1 ⑥root ⑦root ⑧430540 ⑨Dec 20 18:27 ⑩/usr/sbin/passwd ,现在逐一分析其内容. ①. 首字符-,表 ...

  4. .NET Framework 各个版本介绍

    .NET Framework 1.1 自1.0版本以来的改进:自带了对mobile asp .net控件的支持.这在1.0版本是以附加功能方式实现的,现在已经集成到框架的内部.安全方面的变更 - 使得 ...

  5. SICP-Elements of program

    编程语言=组合简单形成复杂的工具 简单的声明和表达式 简单元素之间的组合方式 组合后元素的抽象方式 程序=数据+函数 数据是我们要处理的内容 函数是我们处理数据的方式 函数式与中缀式 函数式不会出现歧 ...

  6. JavaWeb 环境搭建

    环境搭建 JDK7 Java基本开发工具包 安装(目录[不要使用中文和空格].JDK+JRE) 配置环境变量[JAVA_HOME.path.classpath] 2.        Tomcat7 提 ...

  7. windows端口占用处理工具

    一.描述 笔者在最近使用tomcat时,老是会遇到这种端口占用的问题,便写了这个小的exe,用于解决windows下的端口占用问题. 好吧,其实是我实在记不住CMD下的那几行命令.这玩意的实现比较简单 ...

  8. JAVA基础——方法笔记

    java方法_学习笔记 由于我本人对java方法已经比较熟悉了,java方法的定义和使用也比较简单,这里只列举了基于我自身容易搞错的地方,希望对大家的学习有帮助!! 方法的参数可以是基本数据类型,如 ...

  9. JAVA基础——变量和常量

    JAVA的变量和常量知识总结 一.认识java标识符 标识符就是用于给 Java 程序中变量.类.方法等命名的符号. 使用标识符时,需要遵守几条规则: 1.  标识符可以由字母.数字.下划线(_).美 ...

  10. JS中创建自定义对象的方法

    1.直接给对象扩充属性和方法: 2.对象字面量: 3.工厂方式: 4.构造函数方式: 5.原型方式: 6.混合方式. <script> // 1.直接给对象扩充属性和方法; var cat ...