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
分享到:
相关推荐
本文将详细介绍如何在SQL Server中分析死锁进程,特别是如何通过存储过程来捕捉和分析死锁信息。 ### 死锁分析存储过程 在给定的部分内容中,可以看到一个名为`sp_check_lock`的存储过程被创建,其主要目的是检查...
"SQLServer自动杀死死锁进程"这一话题旨在探讨如何配置SQL Server来自动检测并解决这些死锁情况,以避免系统阻塞和性能下降。 1. **死锁的基本概念**: 死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一...
通过上述代码,我们可以看出这个存储过程的主要功能是检测SQL Server中出现的死锁情况,并提供有关被阻塞进程的信息,包括它们正在执行的SQL语句。这对于诊断和解决SQL Server中的死锁问题非常有帮助。此外,它还...
以上介绍了如何在SQL Server中诊断和解决死锁问题的方法,主要包括查询锁信息、查询导致死锁的SQL语句以及如何结束死锁进程。这些方法对于维护数据库系统的稳定性和提高效率具有重要意义。在实际操作中,还需要结合...
- 如果无法通过其他方式解决死锁,可以考虑强制结束死锁进程。声明一个变量存储SPID,然后构建并执行`KILL`语句,如`KILL [SPID]`。但请注意,这种方法应当谨慎使用,因为它可能导致未完成的事务丢失,可能破坏数据...
### SQL Server 死锁处理详解 #### 一、引言 在 SQL Server 数据库系统中,当两个或多个事务在等待对方释放资源时,就会发生死锁现象。死锁不仅会降低系统的整体性能,还可能导致数据处理异常中断,严重影响业务...
根据提供的文件信息,文件名为“sqlserver2000中如何自动杀死死锁进程.pdf”,并且该文档描述了如何在SQL Server 2000环境下自动检测并解决死锁问题的详细过程。以下将详细阐述该文件中的知识点。 1. 死锁的定义与...
首先,要查询死锁进程,可以使用以下SQL语句: ```sql select request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' ``` 这...
- 使用系统视图:许多数据库系统提供了内置视图(如SQL Server的sys.dm_tran_locks,Oracle的v$lock),用于查看当前的锁定状态,帮助找出潜在的死锁。 - 错误日志:数据库系统通常会在发生死锁时记录错误信息,通过...
这个存储过程通过分析`sysprocesses`表中的数据,返回包含死锁事务的SPID(会话进程ID)和被阻塞的SPID,以及它们正在执行的SQL语句,便于快速定位问题。 #### 存储过程的使用 一旦创建了`sp_who_lock`存储过程,...
【SQL Server中的死锁】 死锁是数据库管理系统中常见的一个问题,尤其在SQL Server中也不例外。死锁发生时,两个或多个事务互相等待对方释放资源,导致它们都无法继续执行,形成僵持状态。这种情况可能导致系统性能...
此外,还可以创建一个存储过程`p_lockinfo`,该过程不仅能够显示死锁信息,还可以根据参数选择是否杀死死锁进程: ```sql create proc p_lockinfo @kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示 @...
两个进程发生死锁的典型例子是:进程T1中获取锁A,申请锁B;进程T2中获取锁B,申请锁A,我们下面动手来演示一下这种情况: 1. 创建一个Database,名为InvDB。 2. 执行下面脚本创建person表并填充两条数据: 3. 在...
### SQL Server 并发分析及解决办法 #### 一、并发问题概述 在现代数据库管理系统中,尤其是在SQL Server这样的企业级数据库系统中,并发管理是一个非常关键的话题。并发指的是多个事务或查询同时运行的情况,这...
3. **资源排序和死锁检测**:在应用程序层面实现死锁检测,或者调整SQL Server的死锁检测参数,以便更早地检测和解决死锁。 4. **资源请求顺序**:确保所有进程以相同顺序请求资源,可以减少死锁的可能性。 5. **...
SQL Server死锁是数据库管理系统中常见的并发问题,当两个或多个进程在执行过程中互相等待对方释放资源,而造成永久阻塞时,就产生了死锁。为了解决死锁问题,需要对死锁产生的原因有深入的理解,并且掌握相应的解决...