查询SQL数据库死锁

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

创建sp_who_lock存储过程

CREATE procedure sp_who_lock
as
begin
   declare @spid int
   declare @blk int
   declare @count int
   declare @index int
   declare @lock tinyint
   set @lock=0
   create table #temp_who_lock
 (
  id int identity(1,1),
  spid int,
  blk int
 )
 if @@error<>0 return @@error
 insert into #temp_who_lock(spid,blk)
 select 0 ,blocked
 from (select * from master..sysprocesses where blocked>0)a
 where not exists(select * from  master..sysprocesses where a.blocked =spid and blocked>0)
 union select spid,blocked from  master..sysprocesses where blocked>0
 if @@error<>0 return @@error
 select @count=count(*),@index=1 from #temp_who_lock
 if @@error<>0 return @@error
 if @count=0
 begin
  select ‘没有阻塞和死锁信息‘
  return 0
 end
 while @index<=@count
 begin
  if exists(select 1 from #temp_who_lock a where id>@index and exists(select 1 from #temp_who_lock where id<=@index and a.blk=spid))
  begin
   set @lock=1
   select @spid=spid,@blk=blk from #temp_who_lock where id=@index
   select ‘引起数据库死锁的是: ‘+ CAST(@spid AS VARCHAR(10)) + ‘进程号,其执行的SQL语法如下‘
   select  @spid, @blk
   dbcc inputbuffer(@spid)
   dbcc inputbuffer(@blk)
  end
  set @index=@index+1
 end
 if @lock=0
 begin
  set @index=1
  while @index<=@count
  begin
   select @spid=spid,@blk=blk from #temp_who_lock where id=@index
   if @spid=0
    select ‘引起阻塞的是:‘+cast(@blk as varchar(10))+ ‘进程号,其执行的SQL语法如下‘
   else
    select ‘进程号SPID:‘+ CAST(@spid AS VARCHAR(10))+ ‘被‘ + ‘进程号SPID:‘+ CAST(@blk AS VARCHAR(10)) +‘阻塞,其当前进程执行的SQL语法如下‘
   dbcc inputbuffer(@spid)
   dbcc inputbuffer(@blk)
   set @index=@index+1
  end
 end
 drop table #temp_who_lock
 return 0
end            

GO 
时间: 2024-08-27 13:39:44

查询SQL数据库死锁的相关文章

查询Sqlserver数据库死锁的一个存储过程

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

一个最简单的使用Entity Framework 查询SQL 数据库的例子

1.ADO.NET 3.5 Entity Framework是随着.net framework 3.5一起发布的,确认开发环境版本是大于等于3.5版本 2.确认已经安装了ADO.NET 3.5 Entity Framework 和ADO.NET 3.5 Entity Framework Tools:右键单击创建的winform或者wpf程序,选择"Add|New Item",查看Templates 列表框中是否有ADO.NET Entity Data Model,如果没有,请到此网址下

查询sql数据库中表占用的空间大小

最近在给一家客户做系统维护时,需要查看数据库表的大小,相关的sql如下: 先在左上角下拉框中选对要查的数据库再执行以下语句 1. exec sp_spaceused '表名'          --(SQL统计数据,大量事务操作后可能不准)2. exec sp_spaceused '表名', true       --(准确的表空间大小,但可能会花些统计时间)3. exec sp_spaceused                   -- (数据库大小查询)4. exec sp_MSforea

Powershell 查询SQL数据库资料

豆子对SQL Server自带的sqlps模块并不熟悉.昨天发现Don Jones提供的一个SQL模块,理论上支持任何兼容ODBC Driver的数据库(MySQL, MSSQL, Oracle 等等),原理就是调用.Net框架的一些底层函数.使用起来很方便顺手,也不需要学习新的技能. https://technet.microsoft.com/zh-cn/magazine/hh855069.aspx 下载以后,发现这个模块其实就只包括了两个函数,一个用来查询,另外一个用来修改删除.两个函数都只

C# 用文本框输入的时间段查询SQL数据库

文本框TextBox1和TextBox2 内分别输入时间 用这个时间段来查询数据库 以下两种字符串都能用来查询数据库: 1.string sqlcom = "select * from 表名 where  时间 between '" + TextBox1.Text + "' and '" + TextBox2.Text + "' "; 2.string sqlcom = "select * from 表名 where  时间 >=

查询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语句 SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM sys.dm_os_waiting_tasks 或者创建以下存储过程,查询出来 USE [master] GO /******

解决SQL server2005数据库死锁的经验心得

前段时间提到的"sql server 2005 死锁解决探索",死锁严重,平均每天会发生一次死锁,在解决和处理SQL server2005死锁中查了很多资料和想了很多办法,后来我们就使用了以下方法:       1,将数据库隔离级别改成行版本控制隔离级别.(没有了共享锁死锁)       2,重建和优化索引,优化SQL语句和采用分区视图等方法.提高访问速度.(减少了锁定时间)       3,水平拆分表(分区)并在程序读写时尽量做到分区消除,减少读写的行数,降低锁定升级的频率和时间.

SQLSERVER查询数据库死锁的存储过程

原文:SQLSERVER查询数据库死锁的存储过程 USE [IdentityDemo] GO /****** Object: StoredProcedure [dbo].[sp_who_lock] Script Date: 2019/1/17 10:47:53 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE procedure [dbo].[sp_who_lock] as begin declare @spid in