查找死锁

本文提供了一段SQL Server (MSSQL) 的查询脚本,用于检测并报告数据库中出现的死锁情况及其相关进程信息。通过使用游标和条件判断,能够有效地找出引起死锁的进程及被阻塞的进程,并显示它们正在执行的SQL语句。

MSSQL:

use master
go
declare @spid int,@bl int
DECLARE s_cur CURSOR FOR 
select  0 ,blocked
from (select * from sysprocesses where  blocked>0 ) a 
where not exists(select * from (select * from sysprocesses where  blocked>0 ) b  where a.blocked=spid)
union
select spid,blocked from sysprocesses where  blocked>0
OPEN s_cur
FETCH NEXT FROM s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0
begin
if @spid =0 
            select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'
else
            select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'
DBCC INPUTBUFFER (@bl )
FETCH NEXT FROM s_cur INTO @spid,@bl
end
CLOSE s_cur
DEALLOCATE s_cur

 

/*

                                                        
--------------------------------------------------------
引起数据库死锁的是: 60进程号,其执行的SQL语法如下

(所影响的行数为 1 行)

EventType      Parameters EventInfo            
-------------- ---------- ---------------------
Language Event 0          update AAA SET A =''

(所影响的行数为 1 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
                                                                              
------------------------------------------------------------------------------
进程号SPID:58被进程号SPID:60阻塞,其当前进程执行的SQL语法如下

(所影响的行数为 1 行)

EventType      Parameters EventInfo            
-------------- ---------- ---------------------
Language Event 0          update AAA SET A =''

(所影响的行数为 1 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/

在 MySQL 中,可以通过以下步骤进行死锁查找和解锁: 1. 查找死锁: ```sql SHOW ENGINE INNODB STATUS; ``` 执行以上命令,可以看到类似如下的输出: ``` ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2019-11-11 10:47:09 0x7f3c9e2a1700 *** (1) TRANSACTION: TRANSACTION 210885, ACTIVE 0 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 5 lock struct(s), heap size 1184, 2 row lock(s) MySQL thread id 110, OS thread handle 139777748852992, query id 2726972 localhost root updating UPDATE `users` SET `name`='Alice', `age`=30 WHERE `id`=1 *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 1 page no 3 n bits 72 index PRIMARY of table `test`.`users` trx id 210885 lock_mode X locks rec but not gap waiting Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 4; hex 80000001; asc ;; 1: len 6; hex 0000020d423d; asc =B=;; 2: len 7; hex 00000000000210; asc ;; *** (2) TRANSACTION: TRANSACTION 210886, ACTIVE 0 sec inserting mysql tables in use 1, locked 1 5 lock struct(s), heap size 1184, 2 row lock(s), undo log entries 1 MySQL thread id 111, OS thread handle 139777748919296, query id 2726973 localhost root update INSERT INTO `users` (`name`, `age`) VALUES ('Bob', 25) *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 1 page no 3 n bits 72 index PRIMARY of table `test`.`users` trx id 210886 lock_mode X locks rec but not gap Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 4; hex 80000001; asc ;; 1: len 6; hex 0000020d423d; asc =B=;; 2: len 7; hex 00000000000210; asc ;; *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 1 page no 3 n bits 72 index PRIMARY of table `test`.`users` trx id 210886 lock_mode X locks rec but not gap waiting Record lock, heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 4; hex 80000002; asc ;; 1: len 6; hex 0000020d423e; asc =B>;; *** WE ROLL BACK TRANSACTION (2) ``` 在输出中,可以看到 LATEST DETECTED DEADLOCK,其中包含了死锁发生的信息。 2. 解锁: 根据上面的输出,可以看到死锁发生在 `test`.`users` 表中的记录上,可以通过如下命令来解锁这个记录: ```sql SELECT * FROM `information_schema`.`innodb_locks` WHERE `LOCK_TABLE` = 'users' AND `LOCK_INDEX` = 'PRIMARY' AND `LOCK_TRX_ID` = 210885; ``` 上述命令可以查询到锁定了这个记录的事务的 ID 是 210885,接下来可以使用如下命令来杀死这个事务: ```sql KILL 210885; ``` 这样就可以解锁这个记录。需要注意的是,杀死事务可能会导致数据不一致,需要谨慎操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值