在日常Cache运维过程中可能会由于数据或者程序等原因造成锁的异常增长,导致数据库性能受到影响会出现程序报错或卡顿无法正常运行的问题。遇到此类问题需查看数据库当前锁列表情况,找到出现次数最多关键锁,根据关键锁对应的进程来判断处理。总结有以下三种方式查看关键锁。
- 可在portal的[Locks]中查看;
- 可在terminal端的%sys下使用Do ^LOCKTAB命令下查看;
- 通过自定义程序查看。
查看方式 |
优点 |
缺点 |
第一种 |
易操作、方式简便 |
慢、锁数量太多无法显示 |
第二种 |
快、不受网页限制 |
易忘、需要输入准确命令 |
第三种 |
快、灵活、直接显示关键锁信息 |
需定位准确命名空间 |
下面给出自定义程序实例,程序逻辑为按命名空间循环所有锁信息,通过计数器方式记录所有锁当中出现次数最多的一个,输出其信息。入参为数据库中不同命名空间,输出结果为锁名称及锁的所有者,所有者一般为进程ID或ECP。
ClassMethod FindRootLOCK(Namespace)
{
s lname=""
s Num=0
s LargeOwner=""
s PID=$i(^TMPCacheLocCount("LockCount"))
k ^TMPCacheLocCount("LockCount",PID)
f I=1:1 {
s lname=$o(^$|Namespace|LOCK(lname))
q:lname=""
s OWNER=$g(^$LOCK(lname,"OWNER"))
s LOCKET(I)=OWNER
Continue:OWNER=""
i $d(^TMPCacheLocCount("LockCount",PID,OWNER))'=0 d
.s tmpCount=$g(^TMPCacheLocCount("LockCount",PID,OWNER))
.s ^TMPCacheLocCount("LockCount",PID,OWNER)=+tmpCount+1
e d
.s ^TMPCacheLocCount("LockCount",PID,OWNER)=1
i +^TMPCacheLocCount("LockCount",PID,OWNER)>Num d
.s Num=+^TMPCacheLocCount("LockCount",PID,OWNER)
.s LargeOwner=OWNER
w !,"the lock name is: ",lname,"the pid is ",OWNER
}
w !,"the Most lock PID is "_PID_",Owner is "_LargeOwner_",Count:"_Num
QUIT
}
运行的实际效果如下图,可根据情况在程序中修改是否要显示明细。
很实用,经常会用到,总结得很全
很实用