SQL Server---进程死锁查杀

SQLServer---进程死锁查杀

最近在某学院评教系统中遇到了这么一个情况,当机房人数达到上限时,评教过程中就遇到了无法提交的情况。遇到问题后大家第一时间发现了是由于死锁造成的,于是在网上找了一些资料发现了SQL Server中有关于数据库进程死锁查杀的存储过程,如下:(分享给大家)

CREATE proc [dbo].[p_lockinfo]
@kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉,0 仅显示
@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
as 

declare @count int,@s nvarchar(1000),@i int
select id=identity(int,1,1),标志,
进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,
数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu,
登陆时间=login_time,打开事务数=open_tran, 进程状态=status,
工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess,
域名=nt_domain,网卡地址=net_address
into #t from(
select 标志='死锁的进程',
spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,
status,hostname,program_name,hostprocess,nt_domain,net_address,
s1=a.spid,s2=0
from master..sysprocesses a join(
select blocked frommaster..sysprocesses group by blocked
)b on a.spid=b.blocked where a.blocked=0
union all
select '|_牺牲品_>',
spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,
status,hostname,program_name,hostprocess,nt_domain,net_address,
s1=blocked,s2=1
from master..sysprocesses a where blocked<>0
)a order by s1,s2 

select @[email protected]@rowcount,@i=1

if @count=0 and @show_spid_if_nolock=1
begin
insert #t
select 标志='正常的进程',
spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,
open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address
from master..sysprocesses
set @[email protected]@rowcount
end 

if @count>0
begin
create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))
if @kill_lock_spid=1
begin
declare @spid varchar(10),@标志 varchar(10)
while @i<[email protected]
begin
   select @spid=进程ID,@标志=标志 from #t where  [email protected]
   insert #t1 exec('dbcc inputbuffer('[email protected]+')')
   if @标志='死锁的进程' exec('kill'[email protected])
   set @[email protected]+1
end
end
else
while @i<[email protected]
begin
   select @s='dbcc inputbuffer('+cast(进程ID as varchar)+')' from #t where       [email protected]
   insert #t1 exec(@s)
   set @[email protected]+1
end
select a.*,进程的SQL语句=b.EventInfo
from #t a join #t1 b on a.id=b.id
end 

这次造成死锁的原因是:使用SqlServer的时候发现在高并发情况下,频繁更新和频繁查询引发死锁。

解决方法是:在被频繁操作的那张表上添加非聚集索引。

时间: 2024-12-14 18:45:39

SQL Server---进程死锁查杀的相关文章

SQL server下死锁问题

这几天在做一个项目,以前都没怎么搞过多线程,现在开始,只有边学边做了. 一开始的时候,程序报错是,是提示发生死锁,刚开始,自己没什么经验,以为是程序代码的死锁,就用lock代码,把程序给锁起来了,运行程序后,发现有超时现象,查阅资料,后来断定,这个问题是死锁是发生是SQL server上的,特地找了下SQL2008的书,看了下,死锁的解释. 共享锁 排他锁 更新锁 自定义锁 然后查了资料, 查询SQL死锁的 存储过程 create procedure sp_who_lock   as   beg

SQL SERVER - 谈死锁的监控分析解决思路

1 背景 1.1 报警情况 最近整理笔记,打算全部迁移到EVERNOTE.整理到锁这一部分,里边刚好有个自己记录下来的案例,重新整理分享下给大家. 某日中午,收到报警短信,DB死锁异常,单分钟死锁120个. 死锁的xml文件如下: 1 <deadlock-list> 2 <deadlock victim="process810b00cf8"> 3 <process-list> 4 <process id="process810b00c

Sql Server 检测死锁的SQL语句

首先创建一个标量值函数DigLock,用来递归检测SqlServer中的每一个会话是否存在加锁循环,如果该函数最终返回1则表示检测到了加锁循环 (也就是说检测到了死锁),如果最终返回0则表示没有检测到加锁循环. 1 CREATE FUNCTION [dbo].[DigLock] 2 ( 3 @spid int, 4 @orginSpid int 5 ) 6 RETURNS bit 7 AS 8 BEGIN 9 declare @blockedSpid int=null; 10 11 select

1月10日 SQL SERVER 增删改查(第一节)

一.登陆 SQL SERVER两种登录方式的设置:Windows身份登录:SqlServer身份登录.如何设置SQLServer身份验证?1.对象资源管理器右击--属性--安全性--SqlServer和Windows身份登录.2.对象资源管理器--安全性--登录--sa--右击--属性--常规--设置密码3.对象资源管理器--安全性--登录--sa--右击--属性--状态--授予,启用重启数据库服务. 二.SQL语句 ( 增.删.改.查) 1.增(两种写法) insert into 表名(列名,

MS SQL Server 增删改查

数据插入 语法:INSERT INTO Table_name(field1,field2……fieldN) values(value1,vlaue2,…valueN) 单行插入用户类型 INSERT INTO userType(TypeName,TypeDescription) VALUES('管理员','管理员') 多行插入用户类型 INSERT INTO UserType(TYpeName,TypeDescription) VALUES('录入员','数据录入员'),('查询员','只能做数

SQL SERVER 查询死锁

方法一: WITH    CTE_SID ( BSID, SID, sql_handle ) AS ( SELECT   blocking_session_id , session_id , sql_handle FROM     sys.dm_exec_requests WHERE    blocking_session_id <> 0 UNION ALL SELECT   A.blocking_session_id , A.session_id , A.sql_handle FROM  

SQL Server 查看死锁的存储过程(转载)

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[sp_who_lock] GO use master go create procedure sp_who_lock as begin declare @spid int,@bl int, @int

查询MS SQL Server数据库死锁的一个存储过程

查询Sqlserver数据库死锁的一个存储过程 使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁.死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉. 利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里. --创建或修改sp_who_lock存储过程 CREATE procedure sp_who_lock --ALTER procedure sp_who_lock as beg

处理sql server的死锁 [kill spid]

出现死锁的解决办法 在master中创建查看死锁的存储过程 [sql] view plaincopy use master go create procedure sp_who_lock as begin declare @spid int,@bl int, @intTransactionCountOnEntry  int, @intRowcount    int, @intCountProperties   int, @intCounter    int create table #tmp_l