SqlServer中如何解决session阻塞问题(SqlServer中如何解决session阻塞问题)
SqlServer中如何解决session阻塞问题
SqlServer中如何解决session阻塞问题简介
对于数据库运维人员来说创建session或者查询时产生问题是常规情况,下面介绍一种很有效且不借助第三方工具的方式来解决类似问题。
最近开始接触运维工作,所以自己总结一些方案便于不懂数据库的同事解决一些不太紧要的数据库问题。类似方法很多理论也很多,我就不做深究,就是简单写一个方案,便于菜鸟使用的。
阻塞理解
在Sql Server 中当一个数据库会话中的事务正锁定一个或多个其他会话事务想要读取或修改的资源时,会产生阻塞(Blocking)。通常短时间的阻塞没有问题,且是较忙的应用程序所需要的。然而,设计糟糕的应用程序会导致长时间的阻塞,这就不必要地锁定了资源,而且阻塞了其他会话读取和更新它们。
例子
为了更好说明,下面用一个例子来介绍。创建一个表并插入数据,然后创建不同的session,同事阻塞session。具体的代码截图如下:
1.创建表Employee
2.插入测试数据
现在我们有了测试表,表中有12条数据,打开另一个查询对话框在SSMS中(意味着重新创建了一个session)
3.在新的查询窗口中首先要开启事务,然后写一个插入语句
在这个地方,我们能看到开启了一个事务。但是没有end tran 来终止事务,因此事务状态为“open”,现在运行脚本来看一下当前看起的运行处于“open”状态的session。
现在能够看到如上图展示一样,运行的查询正在open状态的session。我们执行了这个命令但是没有完结它,DBA会联系这个session的创建者来完成事务,或者回滚事务。
现在让我们创建另一个session,更新一条记录并且不提交,即让查询session的状态为“open”。因此在新的查询窗口中 写一个语句来执行如下:
这里会看到系统正在运行后没有完成语句的状态(因为上一个事务没有关闭导致表锁,这个不能插入),现在可以在另外的窗口查询一下阻塞的情况,如下检查阻塞的session。
如上所示,阻塞的session ID是58,由于我们更新查询导致阻塞了54的执行,54就是我们插入数据未提交的批处理。
现在我们能搞清楚阻塞的原因,也就可以从容解决阻塞了。
解决
方案1
在了解业务的情况下,可以直接使用kill session ID的语句来终止某个阻塞的session。
方案2
在执行的事务的起始加入“set lock_timeout 1000” 语句,这表示如果阻塞超过1000毫秒,这个请求将被终止。
方案3
回滚或者提交事务。这个就不细说了。
下面是所有语句的代码:
/****Creating dummy table Employee ****/ CREATE TABLE Employee ( Empid int NOT NULL, Name nchar(10) NULL, City nchar(10) NULL ) ON [PRIMARY] GO /**** Insert dummy data in Employee table *****/ Insert into Employee Values(1245,'George','Jax'), (1045,'Peter','Anadale'), (1157,'John','Dallas'), (1175,'Pete','Topeka'), (875,'Petron','Vienna'), (2311,'Kohli','Mumbai'), (1547,'Peter','Kansas'), (3514,'Abian','KHI'), (4251,'Ghani','Alexandria'), (957,'Ahmed','Vienna'), (1084,'Bhanu','Manderin'), (2954,'Ganeshan','Mcclean') /***** Insert query in new session ****/ BEGIN TRAN Insert into Employee Values(1245,'George','Jax') /**** Query to check currently running sessions ****/ SELECT DISTINCT name AS database_name, session_id, host_name, login_time, login_name, reads, writes FROM sys.dm_exec_sessions LEFT OUTER JOIN sys.dm_tran_locks ON sys.dm_exec_sessions.session_id = sys.dm_tran_locks.request_session_id INNER JOIN sys.databases ON sys.dm_tran_locks.resource_database_id = sys.databases.database_id WHERE resource_type <> 'DATABASE' --AND name ='specific db name' ORDER BY name /**** update query in new session ****/ update Employee set name = 'SHERAZ' where empid = 1245 /**** Query to check blocking queries with session id ****/ SELECT session_id, blocking_session_id, text FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle); /*** Command if you want to kill blocking session ****/ kill (54)
总结
自己也使用过多种不同的语句来查询定位阻塞甚至死锁,然后解决,这里也是介绍一种临时解决方式。万变不离其宗,归根结底还是因为代码甚至数据库设计上存在很多问题才导致的阻塞,比如缺失索引、事务中的查询性能和逻辑顺序存在问题、T-SQL语句性能引起的等等不一而足。对于一些常年解决类似问题的DBA人员来说没啥价值,但是对于不太理解数据库的人来说还是能暂时解决一些紧急问题,当然最后还是要把理论基础打好才能尽可能的杜绝类似情况。
以上所述是小编给大家介绍的SqlServer中如何解决session阻塞问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!
- php 会话session实现用户登录功能(PHP cookie,session的使用与用户自动登录功能实现方法分析)
- cookie和session流程(浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同)
- laravel关闭错误提示(解决laravel session失效的问题)
- html标签session什么意思(在html页面中取得session中的值的方法)
- php实现无cookie的session(php实现多站点共用session实现单点登录的方法详解)
- HTMl5 sessionStorage和localStorage
- php怎么判断是否有session(PHP中Session ID的实现原理实例分析)
- php回收机制(PHP session垃圾回收机制实例分析)
- django session验证(Django框架验证码用法实例分析)
- dedecms的使用教程(解析DedeCms中data目录下的sessions是什么文件)
- php 设置sessionid生成机制(PHP Cli 模式设置进程名称的方法)
- yii框架使用教程(Yii框架操作cookie与session的方法实例详解)
- thinkphp5表单系统(thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例)
- laravel获取客户端ip(对laravel的session获取与存取方法详解)
- phpsession如何用(如何解决PHP获取不到SESSION信息之一般情况)
- php防session劫持(使用SMB共享来绕过php远程文件包含的限制执行RFI的利用)
- Google 推出了一个游戏生成器,让不会编程的你也能自己设计游戏(推出了一个游戏生成器)
- 二胎家庭老大爱闹情绪,用这招很有效(二胎家庭老大爱闹情绪)
- 一个30岁男人外遇失败的全过程(一个30岁男人外遇失败的全过程)
- 《无敌破坏王2》 不聊彩蛋,聊聊我从动画里看到的现实那些事儿(无敌破坏王2不聊彩蛋)
- 《寄生虫》 三观不正 人类悲欢从来不相通,感同身受也并非本能(寄生虫三观不正)
- 这部动漫中的女孩子,可比101女孩更加励志(这部动漫中的女孩子)
热门推荐
- dedecms安全设置(织梦系统DedeCMS设定栏目及文档权限登录后跳转到登陆前的页面的实现方法)
- 如何防止表单重复提交
- sqlserver 查询锁(sqlserver:查询锁住sql以及解锁方法)
- docker容器启动失败怎么查找原因(解决docker容器启动后马上退出的问题)
- 用docker搭建redis集群(docker实现redis集群搭建的方法步骤)
- mysql5.7.24rpm安装(MySQL系列-YUM及RPM包安装v5.7.34)
- dedecms标签怎么用(浅析DedeCMS GBK版安装sphinx全文索引无法查询无结果的解决方法)
- 测试用例写哪些方面
- serv-u操作手册(serv-U FTP软件的攻击防守修改教程[图文])
- python基本数据结构(浅谈Python编程中3个常用的数据结构和算法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9