`
izuoyan
  • 浏览: 8944361 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL 死锁进程查看与处理

阅读更多
SQL 死锁进程查看与处理
use master --必须在master数据库中创建
go

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_lockinfo]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_lockinfo]
GO

/*--处理死锁

查看当前进程,或死锁进程,并能自动杀掉死进程

因为是针对死的,所以如果有死锁进程,只能查看死锁进程
当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程

感谢: caiyunxia,jiangopen 两位提供的参考信息

--邹建 2004.4--*/

/*--调用示例

exec p_lockinfo
--*/
create proc 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 from master..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 @count=@@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 @count=@@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<=@count
begin
select @spid=进程ID,@标志=标志 from #t where id=@i
insert #t1 exec('dbcc inputbuffer('+@spid+')')
if @标志='死锁的进程' exec('kill '+@spid)
set @i=@i+1
end
end
else
while @i<=@count
begin
select @s='dbcc inputbuffer('+cast(进程ID as varchar)+')' from #t where id=@i
insert #t1 exec(@s)
set @i=@i+1
end
select a.*,进程的SQL语句=b.EventInfo
from #t a join #t1 b on a.id=b.id
end
go


-------------------------------------------------------------
--查看死锁进程:
select 标志,
进程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
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 from master..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
分享到:
评论

相关推荐

    自动杀掉SQLSERVER中的死锁进程

    本过程自动捕捉SQLSERVER中的死锁进程并且自动杀掉

    SQLServler自动杀死死锁进程

    SQLServler自动杀死死锁进程SQL,直接在SqlServer中执行即可

    postgresql查询死锁以及杀死死锁进程sql.txt

    查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql

    SQL SERVER 2008 R2 查看和杀死死锁进程

    SQL SERVER 2008 R2 查看和杀死死锁进程。数据库进程死锁是一个很严重的问题,快速定位到死锁的进程尤为重要。

    Sqlserver分析死锁进程

    Sqlserver分析死锁进程,分析死锁的进程ID号

    Sql Server 查询死锁进程及抛弃进程 ..txt

    在sql server 运行过程中,容易产生死锁,该代码提供了一个查询死锁进程并抛弃的方法。供参考。

    解决SQL死锁问题.sql

    SQL server大并发时软件出现卡顿,需要查询是什么SQL执行时引起的卡顿,同时具有干掉死锁进程,非常实用

    sql数据库死锁查询工具

    数据库死锁,阻塞查询,杀死死锁,阻塞进程

    查看死锁信息.sql

    此代码运行后,会生成一个存储过程,后面直接调用此存储过程即可查看,运行非常方便,可以快速定位死锁进程,快速解决sql数据库死锁问题。希望可以给各位系统管理员带来方便。希望可以给各位系统管理员带来方便。...

    SQL Server死锁总结

    SQL Server死锁总结 死锁的四个必要条件: 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。 请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。 非剥夺条件(No pre-...

    Sqlserver死锁处理(比较好用)

    /**//*--调用示例 exec p_lockinfo 0,1 --*/ create proc p_lockinfo @kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉...@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示

    sqlserver2000中如何自动杀死死锁进程.pdf

    sqlserver2000中如何自动杀死死锁进程.pdf

    SQL查询死锁

    select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下' else select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞...

    查询死锁的sql.txt

    查询死锁的sql,一般数据库死锁了,可以查询出死锁的sql语句,死锁进程等信息。

    数据库死锁判断SQL

    判断数据库死锁的SQL,可以检测出死锁的语句和进程

    sqlserver进程死锁关闭的方法

    主要介绍了sqlserver进程死锁关闭的方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    详解SQL死锁检测的方法

    sql server中的死锁是指进程之间互相永久阻塞的状态,下文就将为您介绍如何检测sql server死锁,希望对您有所帮助。 死锁(deadlock)指进程之间互相永久阻塞的状态,SQL可以检测到死锁,并选择终止其中一个事务以...

    SQL Server里如何处理死锁

    在的文章里,我想谈下SQL Server里如何处理死锁。当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作。首先我想给你大致讲下SQL Server如何处理死锁。后我会展示下SQL Sever里特定的死锁类型,还有你...

    SqlServer查询和Kill进程死锁的语句

    主要介绍了SqlServer查询和Kill进程死锁的语句,非常不错,具有参考借鉴价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics