如何知道是哪个进程造成死锁?如何把这个进程杀掉?

lucky_and_happy 2004-03-26 09:18:25
谢谢
...全文
432 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rouqu 2004-09-14
  • 打赏
  • 举报
回复
sp_lock mode为‘X’的就是死锁进程
wgy2008 2004-09-14
  • 打赏
  • 举报
回复
CREATE PROCEDURE SP_AUTOKILLID AS
declare
@li_lockcnt integer,
@li_spid integer,
@ls_cmd char(50),
@ls_sql char(30)
select @li_lockcnt = count(*) from master..syslocks where type =258
if @li_lockcnt<1
return
else
begin

select @li_spid = spid from master..syslocks where type = 258
if @li_spid is null
return
else
begin
select @ls_cmd = cmd from master..sysprocesses where spid = @li_spid
if @ls_cmd = 'AWAITING COMMAND'
begin
select @ls_sql = 'KILL '+ltrim(str(@li_spid))
exec(@ls_sql)
end
end
end




GO
General521 2004-09-13
  • 打赏
  • 举报
回复
我想杀掉进程应该是将其在系统表中的对应记录删除掉,然而jiangopen(jiangopen) 的存储过程当中怎么都是查询啊,请各位高人指点一下.
General521 2004-09-13
  • 打赏
  • 举报
回复
企业管理器->服务器->管理工具->活动->当前活动 然后把他kill掉。。。
进程信息中,如果发现旁边有一个惊叹号状的图标,就表明这个进程是死锁,kill掉
xsphello 2004-09-09
  • 打赏
  • 举报
回复
学习
jiangopen 2004-04-04
  • 打赏
  • 举报
回复
试试俺的存储过程,你可以把它改成自动杀死锁进程的

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, 7 ),
'登录名' = 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, 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, 7 ),
'登录名' = loginame
from master..sysprocesses
where blocked <> 0
order by spid
end

else
begin
select '恭喜!当前没有阻塞,当前的进程信息如下.', convert (char(24),getdate(),13)
select
'进程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, 7 ),
'登录名' = loginame
from master..sysprocesses
where blocked = 0
order by spid
end

return
GO
hiaming 2004-03-30
  • 打赏
  • 举报
回复
mark
tinghuyang 2004-03-29
  • 打赏
  • 举报
回复
up
LoveSQL 2004-03-26
  • 打赏
  • 举报
回复
用sql profiler 监视就可以知道那个进程,
然后kill 进程号就行了
txlicenhe 2004-03-26
  • 打赏
  • 举报
回复
1:sp_who 或 sp_who2
2: Select * from sysprocesses where blocked <> 0
3: 企业管理器->服务器->管理工具->活动->当前活动 然后把他kill掉。。。
进程信息中,如果发现旁边有一个锁状的图标,就表明这个进程是死锁,kill掉
4:SQL事件探查器,监控一下,看主要是那些处理引起的死锁.然后做相应的处理.
用事件探查器new一个trace,监视一下造成你sqlserver停顿的情况。。。

在跟踪属性中->事件->锁->添加相应的锁->运行

若要让它只记录阻塞和死锁的数据,则相应的锁选择如下两种,其它的不选:
DeadLock
DeadLock Chain
LoveSQL 2004-03-26
  • 打赏
  • 举报
回复
用sql profiler 监视就可以知道那个进程,
然后kill 进程号就行了
zjcxc 2004-03-26
  • 打赏
  • 举报
回复
KILL
根据系统进程 ID (SPID) 终止用户进程。如果指定的 SPID 或 UOW 有许多工作要取消,KILL 命令可能需要一些时间来完成,特别是在涉及回滚长事务时。

在 Microsoft® SQL Server™ 2000 中,KILL 命令可用来终止正常连接,这将在内部终止与给定 SPID 关联的事务。另外,在使用 Microsoft 分布式事务处理协调器 (MS DTC) 时,该命令也可用于终止所有孤立的分布式事务。当分布式事务未与任何当前 SPID 关联时,即为孤立的。

语法
KILL {spid | UOW} [WITH STATUSONLY]

参数
spid

是要终止进程的系统进程 ID (SPID)。SPID 值是当用户进行连接时指派给该连接的一个唯一的整数 (smallint),但该指派不是永久的。

使用 KILL spid 终止与给定 SPID 相关联的常规非分布式和分布式事务。

UOW

标识 DTC 事务的工作单元 ID (UOW)。UOW 是一个字符串,可从 syslockinfo 表中获得,该表把 UOW 赋予每个由 DTC 事务控制的锁。UOW 也可从错误日志中获得,或通过 DTC 监视器获得。有关监视分布式事务的更多信息,请参见"MS DTC 用户手册"。

使用 KILL UOW 终止孤立的 DTC 事务,这些事务不与任何真实的 SPID 关联,而是手工与 SPID = '-2' 关联。有关 SPID = '-2' 的更多信息,请参见本主题后面的注释部分。

WITH STATUSONLY

指定 SQL Server 生成关于正在回滚的给定 spid 或 UOW 的进度报告。带 WITH STATUSONLY 的 KILL 命令不终止或回滚 spid 或 UOW,而只显示当前进度报告。

若要使带 WITH STATUSONLY 选项的 KILL 命令成功地生成报告,spid 或 UOW 当前必须处于回滚状态。进度报告指出已完成的回滚量(按百分比计算)和估计的剩余时间(以秒为单位),格式如下:

Spid|UOW <xxx>: Transaction rollback in progress. Estimated rollback completion: yy% Estimated time left: zz seconds.

如果执行带 WITH STATUSONLY 选项的 KILL 命令时 spid 或 UOW 回滚已经结束,或者如果没有 spid 或 UOW 正在回滚,带 WITH STATUSONLY 的 KILL 命令将返回下列错误:

Status report cannot be obtained. KILL/ROLLBACK operator for Process ID|UOW <xxx> is not in progress.

执行两次不带 WITH STATUSONLY 选项的 KILL spid|UOW 命令可得到同样的状态报告;但不建议这样做。第二次执行命令可能会终止已指派给释放的 SPID 的新进程。

注释
KILL 命令通常用于终止这样一些进程,它们锁住了其它重要进程,或者正在执行一个查询,而该查询正在使用必需的系统资源。系统进程和运行扩展存储过程的进程不能被终止。

应当小心使用 KILL 命令,特别是正在运行重要进程时。用户不能取消自己的进程。其它不能取消的进程包括:

AWAITING COMMAND


CHECKPOINT SLEEP


LAZY WRITER


LOCK MONITOR


SELECT


SIGNAL HANDLER
执行 sp_who 可得到有效 SPID 值的报告。如果某个特定的 SPID 的回滚正在进行,则 sp_who 结果集中的这个 SPID 的 cmd 列将显示"KILLED/ROLLBACK"。

使用 @@SPID 可显示当前会话的 SPID 值。

在 SQL Server 2000 中,KILL 命令可用于解决与非分布式和分布式事务相关联的 SPID。KILL 还可用于解决孤立的或置疑的分布式事务。当分布式事务未与任何当前 SPID 关联时,即为孤立的。

SPID 值为 '-2' 用于指示无连接或孤立的事务。SQL Server 将该值指派给所有孤立的分布式事务,使在 sp_lock(spid 列)、sp_who(blk 列)、syslockinfo 和 sysprocesses 中标识这样的事务更容易。当特定的连接在数据库资源上有锁并阻塞事务进程时,该功能十分有用。用户能够识别拥有锁的 SPID,并结束连接。

KILL 命令可用来解决怀疑有问题的事务,即由于未计划重新启动数据库服务器或 DTC 处理协调器而产生的未解决的分布式事务。有关解决怀疑有问题的事务的更多信息,请参见 MS DTC 事务疑难解答。

权限
默认情况下,sysadmin 和 processadmin 固定数据库角色的成员具有 KILL 的默认权限,KILL 权限不可转让。

示例
A. 使用 KILL 终止 SPID
下面的示例显示如何终止 SPID 53。

KILL 53

B. 使用 KILL spid WITH STATUSONLY 获得进度报告。
下面的示例为特定的 spid 生成回滚进程的状态。

KILL 54
KILL 54 WITH STATUSONLY

--This is the progress report.
spid 54: Transaction rollback in progress. Estimated rollback completion: 80% Estimated time left: 10 seconds.

C. 使用 KILL 终止孤立的分布式事务。
下例说明如何使用 UOW = D5499C66-E398-45CA-BF7E-DC9C194B48CF 终止孤立 (SPID = -2) 事务。

KILL 'D5499C66-E398-45CA-BF7E-DC9C194B48CF'

zjcxc 2004-03-26
  • 打赏
  • 举报
回复
sp_lock
报告有关锁的信息。

语法
sp_lock [[@spid1 =] 'spid1'] [,[@spid2 =] 'spid2']

参数
[@spid1 =] 'spid1'

是来自 master.dbo.sysprocesses 的 Microsoft® SQL Server™ 进程 ID 号。spid1 的数据类型为 int,默认值为 NULL。执行 sp_who 可获取有关该锁的进程信息。如果没有指定 spid1,则显示所有锁的信息。

[@spid2 =] 'spid2'

是用于检查锁信息的另一个 SQL Server 进程 ID 号。spid2 的数据类型为 int,默认设置为 NULL。spid2 为可以与 spid1 同时拥有锁的另一个 spid,用户还可获取有关它的信息。



说明 sp_who 可含有 0 个、1 个或 2 个参数。这些参数确定存储过程是显示全部、1 个还是 2 个 spid 进程的锁定信息。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧