杀掉那些死锁的进程

  前些天,同事遇到一个死锁的问题,又想起三年前面试的时候问的一个with(nolock)相关的问题,一下子不知道怎么解锁,走过去看看,一下子不知道怎么写,忙活了一会,弄出个东东,核心主要是视图sys.SysProcesses,它源自于系统表sysprocesses,前者是微软推荐的用法,因为后者在未来SQL
Server版本中可能会被隐藏。视图字段含义见这里。然后是kill
命令,它加上进程id就可以杀掉相应进程,它的简单用法如下:

1 use Test
2 go
3 -- 列出所有进程信息
4 EXEC sp_who2
5 go
6
7 -- 执行杀掉进程命令
8 KILL 29
9 go

准备工作:

 1 CREATE TABLE  TestDead
2 (
3 id INT IDENTITY(1,1) PRIMARY KEY,
4 name NVARCHAR(10) NOT NULL
5 )
6 GO
7
8 CREATE TABLE TestDead2
9 (
10 id INT IDENTITY(1,1) PRIMARY KEY,
11 name NVARCHAR(10) NOT NULL
12 )
13 GO
14
15 INSERT INTO TestDead(name)
16 VALUES (‘name01‘),
17 (‘name02‘),
18 (‘name03‘)
19 GO
20
21 INSERT INTO TestDead2(name)
22 VALUES (‘name01‘),
23 (‘name02‘),
24 (‘name03‘)
25 GO
26
27 BEGIN TRAN -- 打开一个更新事务,不提交, 锁住第一个表
28
29 UPDATE TestDead SET name = ‘nameXX‘ WHERE id = 1
30
31 GO
32
33
34 BEGIN TRAN --开始一个事务,不提交,锁住第二个表
35
36 UPDATE TestDead2 SET name = ‘nameXX‘ WHERE id = 1
37
38 GO

创建了表之后,开始一个更新数据的事务并锁住了表,然后新建多个查询窗口,在各个不同窗口中,分别执行下面两条语句:

1 -- 查询第一个表
2
3 select * from TestDead
4
5
6 -- 查询第二个表
7
8 select * from TestDead2

现在由于表被锁住,是查询不出数据,除非在后面加上
with(nolock),如:

1 select * from TestDead2 with(nolock)

列出并杀掉那些死锁的进程:

 1 -- =============================================
2 -- Author: Mike Deng
3 -- Create date: 2014/05/14
4 -- Description: 杀掉死锁进程
5 -- =============================================
6
7 DECLARE @toKill BIT = 0 --0 或 NULL 只显示, 1.杀掉
8
9 BEGIN
10 DECLARE @sql NVARCHAR(MAX);
11 DECLARE @fromSql NVARCHAR(MAX);
12
13 -- 查询出所有死锁和与被阻塞的进程
14 SET @fromSql = ‘
15 DECLARE @cmd NVARCHAR(MAX);
16 ;WITH CTE as(
17 SELECT DISTINCT Type = ‘‘死锁的进程‘‘
18 , a.spid
19 , blockId = 0
20 , DBName = DB_NAME(a.dbid)
21 , a.HostName
22 , ProgramName = a.Program_Name
23 , Dead = 1
24 FROM SYS.SYSPROCESSES a JOIN
25 SYS.SYSPROCESSES as b ON a.spid = b.blocked
26 WHERE a.blocked = 0
27 UNION ALL
28 SELECT DISTINCT Type = ‘‘被阻塞的进程‘‘
29 , a.spid
30 , blockId = a.blocked
31 , DBName = DB_NAME(a.dbid)
32 , a.HostName
33 , ProgramName = a.Program_Name
34 , Dead = 0
35 FROM SYS.SYSPROCESSES a WHERE blocked <> 0
36 ) ‘
37
38 -- 根据传入的值,决定是否删除
39 IF(ISNULL(@toKill, 0) = 1) --如果等于 1,则杀掉
40 BEGIN
41 SET @sql = @fromSql
42 + ‘SELECT @cmd = (
43 SELECT (‘‘ KILL ‘‘ + LTRIM(str(spid))) FROM cte WHERE dead = 1
44 FOR XML PATH(‘‘‘‘)
45 )
46
47 IF(ISNULL(@cmd, ‘‘‘‘) <> ‘‘‘‘)
48 BEGIN
49 EXEC (@cmd);
50 PRINT ‘‘已执行kill死锁命令【‘‘ + @cmd + ‘‘】, 锁已解除‘‘;
51 END
52 ELSE IF(@@RowCount = 0)
53 BEGIN
54 PRINT ‘‘未发现死锁, 不能杀掉‘‘;
55 END‘
56 END
57 ELSE
58 BEGIN -- 显示所有死锁与被阻塞的进程
59 SET @sql = @fromSql + ‘, cte2 AS( SELECT * FROM cte WHERE Dead = 1
60 UNION ALL
61 SELECT k.* FROM cte AS k JOIN
62 cte2 AS p ON k.blockId = p.spid
63 )
64 SELECT * FROM cte2 ORDER BY blockId‘;
65 END
66
67 EXEC SP_EXECUTESQL @sql
68 END

查询结果:

设置参数 @toKill = 1,杀掉它们。

完工!

杀掉那些死锁的进程,布布扣,bubuko.com

时间: 2024-10-16 12:55:26

杀掉那些死锁的进程的相关文章

sqlserver,杀掉死锁的进程

USE [erpdb1]GO/****** Object:  StoredProcedure [dbo].[p_lockinfo_MyKill]    Script Date: 12/26/2014 14:59:58 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER OFFGO ALTER proc [dbo].[p_lockinfo_MyKill]@kill_lock_spid bit=1,  --是否杀掉死锁的进程,1 杀掉, 0 仅显示@sho

如何杀掉D状态的进程?[zt]【转】

转自:http://blog.csdn.net/chinalinuxzend/article/details/4288791 [-] 如何杀掉D状态的进程zt 相关博文 原贴:http://www.xclinux.cn/?p=752 如何杀掉D状态的进程?[zt] 状态为 D (Uninterruptible sleep) ,以及状态为 Z (Zombie)这些垃圾进程要么是求而不得,像怨妇一般等待资源(D),要么是僵而不死,像冤魂一样等待超度(Z),它们在 CPU run_queue 里滞留不

Android 杀掉当前程序的进程

在销毁所有活动的代码后面再加上杀掉当前进程的代码,以保证程序完全退出,杀掉进程的代码如下所示: android.os.Process.killProcess(android.os.Process.myPid()); 其中,killProcess()方法用于杀掉一个进程,它接收一个进程id参数,我们可以通过myPid()方法来获得当前程序的进程id. 需要注意的是,killProcess()方法只能用于杀掉当前程序的进程,我们不能使用这个方法去杀掉其他程序.

sqlserver检测死锁;杀死锁和进程;查看锁信息

http://blog.sina.com.cn/s/blog_9dcdd2020101nf4v.html sqlserver检测死锁;杀死锁和进程;查看锁信息 (2013-06-09 16:43:03)转载▼ 标签: sql 检测死锁 杀死锁和进程 查看锁信息 it 分类: mssql --检测死锁 --如果发生死锁了,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程? --这时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句.SQL Server自带的系统存储过程sp

杀掉MYSQL死锁进程

vi /usr/local/killmysqlprocess.sh #!/bin/bash #*/1 * * * * /usr/local/src/killmysqlprocess.sh backdir="/usr/local/logs/" logfile="cms_mysql_killprocess_$(date +"%Y%m%d").log" mysqlbindir="/usr/local/mysql/bin/" #use

死锁和进程通信

一.死锁 1.死锁概念 由于竞争资源或者通信关系,两个或更多线程在执行中出现永远相互等待只能由其他进程引发的事件的现象.  2.资源 资源有很多种类型,包括CPU执行时间,内存空间,I/O设备等都被称作资源.其中每类资源有多个实例.进程访问资源有三步:请求/获取,使用/占用,释放. 资源分为两类:一类是可重用资源,如硬件的处理器,I/O通道,主和副存储器,设备等,以及软件中的文件,数据库,信号量等数据结构.另一类是消耗资源,如在I/O缓冲区的中断,信号,消息等. 3.资源分配图 进程和资源在图里

死锁、进程通信

一.死锁 操作系统中有若干进程并发执行,它们不断申请.使用.释放系统资源,虽然系统的进程协调.通信机制会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能继续运行,否则就阻塞的情况.此时,若不借助外界因素,谁也不能释放资源,谁也不能解除阻塞状态.根据这样的情况,操作系统中的死锁被定义为系统中两个或者多个进程无限期地等待永远不会发生的条件,系统处于停滞状态,这就是死锁. 产生死锁的原因主要是: (1) 因为系统资源不足. (2) 进程运行推进的顺序不合适. (3) 资源分配不当等. 

oracle遇到死锁杀进程

java程序操作数据库的时候,遇到死锁:java.sql.SQLException: ORA-00060: 等待资源时检测到死锁 解决步骤: 1.找到死锁的oralce对象(表): select object_name,machine,s.sid,s.serial#from v$locked_object l,dba_objects o ,v$session swhere l.object_id = o.object_id and l.session_id=s.sid and object_na

查看SQL SERVER中引起死锁的进程

create proc sp_lockinfo @kill_lock_spid bit=1, --是否杀掉阻塞的进程,1 杀掉, 0 仅显示 @show_spid_if_nolock bit=1, --如果没有阻塞的进程,是否显示正常进程信息,1 显示,0 不显示 @dbname sysname='' --如果为空,则查询所有的库,如果为null,则查询当前库,否则查询指定库 as set nocount on declare @count int,@s nvarchar(4000),@dbid