自动检测并解锁的程序(FOR MS SQL SERVER 7/2000及以后的版本) 在一些中大型MIS系统中,往往同时在线的工作站有几十台,如果系统有死锁情况发现,会导致很多工作站都暂停工作。对于一些要求很高的系统,比如POS系统则会影响到整个企业的工作,在未能完全找到程序的问题前,您可以使用本系统来临时解决问题,这样只会影响到其中一台导致整个系统死锁的电脑。 原理: 利用ms sql server 的系统存储过程sp_who来列表整个系统进程,并通过blk字段来获得当前是否有进程互相等候,
自动检测并解锁的程序(for ms sql server 7 2000及以后的版本) 曾有网友在CGI论坛发表过类似的程序,但因为转换数据的关系,一些附件丢失了,很抱歉,此程序对于中/大型MIS系统在初级调试阶段较有用,因此我重写了一个,欢迎大家使用。 在一些中大型MIS系统中,往往同时在线的工作站有几十台,如果系统有死锁情况发现,会导致很多工作站都暂停工作。对于一些要求很高的系统,比如POS系统则会影响到整个企业的工作,在未能完全找到程序的问题前,您可以使用本系统来临时解决问题,这样只会影响
代码如下:USE masterDECLARE spid intDECLARE CUR CURSORFOR SELECT spid FROM sysprocesses WHERE dbid = 5FETCH NEXT FROM CUR INTO spidWHILE FETCH_STATUS = 0BEGIN–EXEC (‘KILL ‘ + spid )FETCH NEXT FROM CUR INTO spidENDCLOSE CURDEALLOCATE CUR
问题背景
周一上班,首先向同事了解了一下上周的测试情况,被告知在多实例场景下 MySQL Server hang 住,无法测试下去,原生版本不存在这个问题,而新版本上出现了这个问题,不禁心头一颤,心中不禁感到奇怪,还好现场环境还在,为排查问题提供了一个好的环境,随即便投入到紧张的问题排查过程当中。问题实例表现如下:
代码如下:
并发量为 384 的时候出现的问题;
MySQL 服务器无法执行事务相关的语句,即使简单的 select 语句也无法执行;
所有线程处于等待状态,无法 KILL。
现场
正常情况下,死锁发生时,权重最小的连接将被kill并回滚。但是为了找出语句来优化,启用可启用死锁将死锁信息记录下来。
#step 1:窗口一
mysql> start transaction;
mysql> update aa set name='aaa' where id = 1;
#step 2:窗口二
mysql> start transaction;
mysql> update bb set name='bbb' where id = 1;
#step 3:窗口
1、查询进程
show processlist
2、 查询到相对应的进程,然后 kill id
验证(kill后再看是否还有锁)
2、查询是否锁表
show OPEN TABLES where In_use > 0;
示例:
新建一个会话执行如下的显示锁示例
LOCK TABLES account_data.account READ;
SELECT SLEEP(160);
UNLOCK TABLES account_data.account;
另开启一个会话检查锁表情况:
my