博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
session阻塞的问题
阅读量:7088 次
发布时间:2019-06-28

本文共 1924 字,大约阅读时间需要 6 分钟。

简介

    对于数据库运维人员来说创建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

回滚或者提交事务。这个就不细说了。

下面是所有语句的代码:

 

   Employee ( Empid   , Name () , City ()  )       Employee (,,), (,,), (,,), (,,), (,,), (,,), (,,), (,,), (,,), (,,), (,,), (,,)      Employee (,,)    name  database_name, session_id, , login_time, login_name, reads, writes  sys.dm_exec_sessions    sys.dm_tran_locks  sys.dm_exec_sessions.session_id  sys.dm_tran_locks.request_session_id   sys.databases  sys.dm_tran_locks.resource_database_id  sys.databases.database_id  resource_type
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)
      本文转自zsdnr  51CTO博客,原文链接:http://blog.51cto.com/12942149/1944650
,如需转载请自行联系原作者
你可能感兴趣的文章
用Nginx配置https加密站点
查看>>
Sersync数据同步
查看>>
hsrp+track
查看>>
Spring mvc 在一个定时器类里实现多个定时器任务
查看>>
Window下打开并读取文件的方法
查看>>
[讨论]UI层到底使用哪种类?
查看>>
使用JIRA搭建企业问题跟踪系统-1
查看>>
电脑族适合的花草茶
查看>>
saltstack知识点2
查看>>
Jenkins Pipeline
查看>>
ansible 模块之 yum模块详解
查看>>
PhoneGap跨平台Android环境的搭建
查看>>
西北大学(Northwestern University)-大数据分析课程
查看>>
php框架-hoby
查看>>
7.1 vim编辑器
查看>>
bash 词频统计
查看>>
Python之转义字符表
查看>>
mysql并发插入重复数据问题的解决思路
查看>>
MySQL 5.7.x修改root默认密码(CentOS下)
查看>>
Linux下动态加载SO文件
查看>>