SET QUOTED_IDENTIFIER ON<wbr></wbr>
GO
SET ANSI_NULLS ON<wbr></wbr>
GO
-- exec proc p_lockinfo 0, 0
ALTER <wbr>proc p_lockinfo</wbr>
@kill_lock_spid bit=1, <wbr>--是否杀掉死锁的进程,1 杀掉, 0
仅显示</wbr>
@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0
不显示
as
declare @count int,@s nvarchar(1000),@i int
select id=identity(int,1,1),标志,
<wbr>进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,</wbr>
<wbr>数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu,</wbr>
<wbr>登陆时间=login_time,打开事务数=open_tran,
进程状态=status,</wbr>
<wbr>工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess,</wbr>
<wbr>域名=nt_domain,网卡地址=net_address</wbr>
into #t from(
<wbr>select 标志='死锁的进程',</wbr>
<wbr>
spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,</wbr>
<wbr>
status,hostname,program_name,hostprocess,nt_domain,net_address,</wbr>
<wbr> s1=a.spid,s2=0</wbr>
<wbr>from master..sysprocesses a join (</wbr>
<wbr> select blocked from master..sysprocesses
group by blocked</wbr>
<wbr> )b on a.spid=b.blocked where
a.blocked=0</wbr>
<wbr>union all</wbr>
<wbr>select '|_牺牲品_>',</wbr>
<wbr>
spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,</wbr>
<wbr>
status,hostname,program_name,hostprocess,nt_domain,net_address,</wbr>
<wbr> s1=blocked,s2=1</wbr>
<wbr>from master..sysprocesses a where
blocked<>0</wbr>
)a order by s1,s2
select @count=@@rowcount,@i=1
if @count=0 and @show_spid_if_nolock=1
begin
<wbr>insert #t</wbr>
<wbr>select 标志='正常的进程',</wbr>
<wbr>
spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,</wbr>
<wbr>
open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address</wbr>
<wbr>from master..sysprocesses</wbr>
<wbr>set @count=@@rowcount</wbr>
end
if @count>0
begin
<wbr>create table #t1(id int identity(1,1),a
nvarchar(30),b Int,EventInfo nvarchar(255))</wbr>
<wbr>if @kill_lock_spid=1</wbr>
<wbr>begin</wbr>
<wbr> declare @spid varchar(10),@标志
varchar(10)</wbr>
<wbr> while @i<=@count</wbr>
<wbr> begin</wbr>
<wbr><wbr>select @spid=进程ID,@标志=标志
from #t where id=@i</wbr></wbr>
<wbr><wbr>insert #t1 exec('dbcc
inputbuffer('+@spid+')')</wbr></wbr>
<wbr><wbr>if @标志='死锁的进程' exec('kill
'+@spid)</wbr></wbr>
<wbr><wbr>set @i=@i+1</wbr></wbr>
<wbr> end</wbr>
<wbr>end</wbr>
<wbr>else</wbr>
<wbr> while @i<=@count</wbr>
<wbr> begin</wbr>
<wbr><wbr>select @s='dbcc
inputbuffer('+cast(进程ID as varchar)+')' from #t where id=@i</wbr></wbr>
<wbr><wbr>insert #t1 exec(@s)</wbr></wbr>
<wbr><wbr>set @i=@i+1</wbr></wbr>
<wbr> end</wbr>
<wbr>select a.*,进程的SQL语句=b.EventInfo</wbr>
<wbr>from #t a join #t1 b on a.id=b.id</wbr>
end
GO
SET QUOTED_IDENTIFIER OFF<wbr></wbr>
GO
SET ANSI_NULLS ON<wbr></wbr>
GO
相关推荐
本案例中提供的存储过程 `p_lockinfo` 就是一种有效的检测死锁的方法。该存储过程通过查询 `sysprocesses` 表来收集当前所有进程的信息,并根据这些信息来判断是否存在死锁。 ##### 2. 处理死锁 一旦检测到死锁,...
1. 使用Create proc p_lockinfo命令来创建一个存储过程,以便快速查询死锁的进程信息。 2. 使用@kill_lock_spid bit=1命令来杀掉死锁的进程。 3. 使用@show_spid_if_no_lock bit=1命令来显示死锁的进程信息。 4. ...
邹建 2004.4 代码如下: /*–调用示例 exec p_lockinfo1 –*/ alter proc p_lockinfo1 @kill_lock_spid bit=1, –是否杀掉死锁的进程,1 杀掉, 0 仅显示 @show_spid_if_nolock bit=1 –如果没有死锁的进程,是否显示...
1. 使用`exec master.dbo.p_lockinfo 0, 0`语句查询死锁的进程,不显示正常的进程。 2. 使用`exec master.dbo.p_lockinfo 1, 0`语句查询死锁的进程,不显示正常的进程。 死锁的解决方法 1. 使用`Create proc p_...
exec p_lockinfo 0,1 --*/ create proc p_lockinfo @kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示 @show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
此外,还可以创建一个存储过程`p_lockinfo`,该过程不仅能够显示死锁信息,还可以根据参数选择是否杀死死锁进程: ```sql create proc p_lockinfo @kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示 @...
CREATE PROCEDURE p_lockinfo @kill_lock_spid bit = 0, -- 是否杀掉死锁的进程 @show_spid_if_nolock bit = 1 -- 如果没有死锁的进程,是否显示正常进程信息 AS BEGIN SET NOCOUNT ON; -- 查询并处理死锁进程 ...
and hit = 1 and status = 0", openid).Update(p_info) // 提现逻辑... // 释放锁 unlockDistributedLock(client, key) ``` 通过这种方式,每个服务实例在处理提现请求前都会尝试获取分布式锁,只有成功获取到锁...
为避免这些问题,开发者应确保数据库配置信息的准确性,选择与应用兼容的驱动版本,同时合理配置数据库连接池,如使用C3P0、HikariCP等,以优化连接管理和资源利用。 2. **404/500错误**:404错误意味着客户端请求...