*--处理死锁
查看当前进程,或死锁进程,并能自动杀掉死进程
因为是针对死的,所以如果有死锁进程,只能查看死锁进程
当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程
--邹建 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
分享到:
相关推荐
本过程自动捕捉SQLSERVER中的死锁进程并且自动杀掉
SQL SERVER 2008 R2 查看和杀死死锁进程。数据库进程死锁是一个很严重的问题,快速定位到死锁的进程尤为重要。
"SQLServer自动杀死死锁进程"这一话题旨在探讨如何配置SQL Server来自动检测并解决这些死锁情况,以避免系统阻塞和性能下降。 1. **死锁的基本概念**: 死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一...
2. 使用exec master..xp_lockinfo 1, 0命令来查询死锁的进程信息,并杀掉死锁的进程。 3. 使用exec master..xp_lockinfo 2, 0命令来查询死锁的进程信息,并显示死锁的进程的详细信息。 SQL Server死锁的解除方法也...
SQL Server进程死锁是数据库管理中常见的问题,它发生在两个或多个事务无法继续进行,因为它们互相等待对方释放资源的情况。解决这个问题对于确保数据库系统的稳定性和数据一致性至关重要。以下是一些关于如何处理...
/**//*--调用示例 exec p_lockinfo 0,1 ...@kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示 @show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
死锁的好处是SQL Server自动检测并解决它们。为了解决死锁,SQL Server需要回滚2个事务中便宜的那个。在SQL Server上下文中,便宜的事务是写入事务日志更少字节的那个。 SQL Server在后台进程中实现死锁检测...
以下是如何在SQL Server 2000中创建一个名为`sp_killlock`的存储过程,以便自动检测并(如果需要)杀死死锁进程的详细步骤: 首先,我们需要创建存储过程`sp_killlock`。以下为存储过程的定义: ```sql CREATE proc...
此外,还可以创建一个存储过程`p_lockinfo`,该过程不仅能够显示死锁信息,还可以根据参数选择是否杀死死锁进程: ```sql create proc p_lockinfo @kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示 @...
SQL Server 发现这个问题时,会选择一个事务杀掉。避免死锁的方法是施加一定的规则,例如按照一定顺序来更新表。 设置锁选项一般让 SQL Server 自动处理锁。有时用户需要控制锁,例如其它用户在修改数据时,也想让...
使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉。利用sp_who_lock这个存储过程,可以很方便的知道...
@kill_lock_spid bit = 0, -- 是否杀掉死锁的进程 @show_spid_if_nolock bit = 1 -- 如果没有死锁的进程,是否显示正常进程信息 AS BEGIN SET NOCOUNT ON; -- 查询并处理死锁进程 DECLARE @count INT, @s ...
此外,你可能还对“sqlserver进程死锁关闭的方法”和“SqlServer查询和Kill进程死锁的语句”感兴趣。在SQL Server中,死锁是两个或多个事务互相等待对方释放资源而形成的一种僵局。可以通过`DBCC INPUTBUFFER(spid)`...
1. **查看当前进程**:存储过程能够列出所有正在运行的SQL Server进程,包括其SPID(会话进程标识符)、KPID(操作系统线程ID)、数据库ID、用户ID、登录名、CPU使用情况、登录时间、打开的事务数、状态、主机名、...