SQL Server定时解锁

 

--未试用过,不知是否可行;

 

在使用用友U8财务系统的时候,经常发现有人将其他人锁住,使其工作停顿。使用定时任务将锁住他人的进程取消。

SQL SERVER系统中,没有找到一个设置可以指定在用户空闲多少时间后自动断开连接(本身对SQL SERVER就不是很感兴趣,又没有多少时间去研究学习。)。可是,在用友U8系统中,总是经常会出现有人将其他人锁住的情况(好象SQL SERVER的锁要比ORACLE的复杂),于是就不停的有人打电话过来说系统死掉了。刚开始的时候还发懵,我这边好好的,你怎么就死掉了呢?后来发现是锁的原因。也不知道是该埋怨SQL SERVER,还是该埋怨用友,想来想去,其他部门的只会埋怨我!

干脆自己写个任务,管你是正常任务,还是异常退出,反正只要锁住其他人超过10分钟,就把你干掉!

本以为事情了结了,结果发现用户还是很聪明的:以前可以跟他们说系统慢,让他们等会儿;现在可好,别人一打电话来就说,我的系统又锁住了,帮我解开!算了,时间缩短到5分钟吧。结果还不行!只好将等待时间减少到两分钟了。要是还打电话过来,就告诉他们,系统现在用的人很多,耐心等待两分钟就OK了!



/*
* 定时释放锁
* Pond Ka
* 2004年8月18日
* 试运行1.0
*
* 财务用友U8系统中,常常出现用户被其他用户锁住,系统不能正常运行的情况。
* 在这种情况下,需要手工将有锁的进程取消掉。
* 此功能将手工更改为自动运行。
*
* 在数据库系统中,作为任务,每1分钟运行一次。
*
* 取消进程的条件:
* 1、锁住了其他进程。
* 2、自身没有被其他进程锁住。
* 3、此进程已经空闲了2分钟以上。
*
*/


DECLARE
@USER_ID INT
, @KILLCMD VARCHAR(100)
, @WAIT_TIME INT
-- 设置空闲时间
SET @WAIT_TIME = 2;
-- 根据选择条件,选择出应该取消的进程
DECLARE cur_lock CURSOR FOR
SELECT spid
FROM master..sysprocesses
WHERE
DATEDIFF(minute, last_batch, getdate()) > @WAIT_TIME
AND blocked = 0
AND spid IN
(SELECT blocked
FROM master..sysprocesses);
-- 取消所有选择出的进程。
OPEN cur_lock;
FETCH NEXT FROM cur_lock INTO @USER_ID;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @KILLCMD = 'kill ' + CAST(@USER_ID AS VARCHAR);
EXECUTE (@KILLCMD);
FETCH NEXT FROM cur_lock INTO @USER_ID;
END;
CLOSE cur_lock;
DEALLOCATE cur_lock;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值