加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLserver数据库死锁处理(治标不治本的方法)

发布时间:2020-12-12 15:41:04 所属栏目:MsSql教程 来源:网络整理
导读:?1、 /* --处理死锁 查看当前进程,或死锁进程,并能自动杀掉死进程 因为是针对死的,所以如果有死锁进程,只能查看死锁进程 当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程 --邹建 2004.4-- */ /* --调用示例 exec p_lockinfo -- */ create proc p_l

?1、/*--处理死锁

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

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

--邹建 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 '|_牺牲品_>',blocked,
? 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 标志='正常的进程',db_name(dbid),
? open_tran,status,net_address
from master..sysprocesses
set @count=@@rowcount
end

if @count>0
begin
create table #t1(id int identity(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

2、稍加改造就能变成自动杀进程的过程 ? ? CREATE ? PROCEDURE ? auto_checkblocks ? AS ? ? set ? nocount ? on ? ? if ? exists ? ( ? select ? * ? from ? master..sysprocesses ? where ? blocked ? <> ? 0 ? ) ? ? ? ? begin ? ? /* ? show ? top ? blockers,? but ? no ? duplicates ? */ ? ? ? ? select ? convert(char(24),getdate(),13) ? ? select ? '注意发生阻塞!请不要慌张,请仔细查看下面的信息。导致问题的锁进程:' ? ? select ? '请尝试使用KILL ? [SPID] ? 来杀进程' ? ? ? ? ? ? ? ? ? ? select ? '请尝试使用SP_LOCK ? [SPID]来显示锁信息,用OBJECT_NAME(ID)来显示锁对象名称或用sp_who ? [SPID] ? 来显示信息' ? ? ? ? ? ? ? ? ? ? select ? '在使用OBJECT_NAME显示对象名称时请注意对应的db_id' ? ? ? ? ? ? select ? distinct ? ? '进程ID' ? ? ? ? ? ? ? ? ? ? ? ? ? ? = ? str( ? spid,? 4 ? ),? ? '进程ID状态' ? ? ? ? ? ? ? ? ? ? = ? convert( ? char(10),? status ? ),? ? '分块进程的进程ID' ? ? ? ? = ? str( ? blocked,? 2 ? ),? ? '工作站名称' ? ? ? ? ? ? ? ? ? ? = ? convert( ? char(10),? hostname ? ),? ? '执行命令的用户' ? ? ? ? ? ? = ? convert( ? char(10),? suser_name( ? uid ? ) ? ),? ? '数据库名' ? ? ? ? ? ? ? ? ? ? ? ? = ? convert( ? char(10),? db_name( ? dbid ? ) ? ),? ? ? ? ? ? ? ? ? '应用程序名' ? ? ? ? ? ? ? ? ? ? = ? convert( ? char(10),? program_name ? ),? ? '正在执行的命令' ? ? ? ? ? ? = ? convert( ? char(16),? cmd ? ),? ? '累计CPU时间' ? ? ? ? ? ? ? ? ? = ? str( ? cpu,? 7 ? ),? ? 'IO' ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = ? str( ? physical_io,? ? ? ? ? ? ? ? ? ? '登录名' ? ? ? ? ? ? ? ? ? ? ? ? ? ? = ? loginame ? ? from ? master..sysprocesses ? ? where ? spid ? in ? ( ? select ? blocked ? from ? master..sysprocesses ? ) ? ? and ? blocked ? = ? 0 ? ? order ? by ? str(spid,4) ? ? ? ? /* ? 显示阻塞牺牲品 ? */ ? ? ? ? ? ? ? ? ? ? select ? '以上阻塞的牺牲品' ? ? ? ? ? ? ? ? ? ? ? select ? ? ? '进程ID[SPID]' ? ? ? ? ? ? ? ? = ? str( ? spid,? ? ? ? ? ? ? ? ? ? '登录名' ? ? ? ? ? ? ? ? ? ? ? ? ? ? = ? loginame ? ? from ? master..sysprocesses ? ? where ? blocked ? <> ? 0 ? ? order ? by ? spid ? ? end ? ? ? ? else ? ? begin ? ? select ? '恭喜!当前没有阻塞,当前的进程信息如下.',? convert ? (char(24),13) ? ? ? ? ? ? ? ? ? ? select ? ? ? '进程ID' ? ? ? ? ? ? ? ? ? ? ? ? ? ? = ? str( ? spid,? ? ? ? ? ? ? ? ? ? '登录名' ? ? ? ? ? ? ? ? ? ? ? ? ? ? = ? loginame ? ? from ? master..sysprocesses ? ? where ? blocked ? = ? 0 ? ? order ? by ? spid ? ? end ? ? ? ? return ? ? GO????

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读