Cache中不同类型锁的理解与分析
Cache锁的异常直接影响数据库进程运行,堆积的锁如果处理不及时会造成Cache性能异常,导致数据库访问受限或严重卡顿。本文主要以实例分析介绍Cache中常见锁的作用及其对应的处理方式,包括:系统锁、数据锁、Session锁、仪器锁、程序文件锁。其中数据锁异常需要及时处理。
查询Cache锁有两种方式:
1>可在System Management Protal的[Home]>[Locks]中查看;
2>可在terminal端使用Do ^LOCKTAB命令下查看,如下图所示,此方式适用于锁表量达到10000条以上,Protal页面HTTP响应超时无法显示锁表时使用。
一、【系统锁】
此类锁在数据库初次搭建时就存在,例如:
1>^%SYS("CSP","Daemon") ---调度锁
2>^TASKMGR ---守护进程
3>^DBACK ---数据库备份锁
4>^SYS("Task","TaskD",1058) ---执行系统任务锁
主要作用
- 调度锁:主要用来调度各个进程产生的锁,是保障数据库运行的基本锁;
- 守护进程:保证数据库任务正常运行,是保障数据库运行的基本锁;
- 数据库备份锁:此锁表示数据库当前有备份任务正在执行;
- 执行系统任务锁:此锁表示正在执行[Home] > [Task Manager] > [View Task Schedule]中ID 为1058的挂载的数据库自动任务,如图1.1所示。
图1.1 View Task Schedule中ID为1058的任务
二、【数据锁】
此类锁多为业务产生,在所有LOCK中占比最大。程序中可通过LOCK命令结合不同参数设定各种锁,例如增量锁,递减锁,共享锁,升级锁,立即解锁,延迟解锁,排他锁,独占锁(有兴趣的同学可以参考学习https://blog.51cto.com/yaoxin/4923409)。
主要作用
是为了保证数据的有序写入、更改、删除,避免产生数据不一致的情况发生。
此类锁以不同的global名称、节点和ID命名:^Globalname(“node”,ID)。造成数据锁一般存在三种情况:
1>当前global所在表被某个进程锁死,当前进程无法对数据进行insert、update、delete;
2>当前global所在表处于编辑或编译状态;
3>一个进程对某个表insert、update、delete超过数据库阈值。
数据库阈值设置以ensemble2010版本为例:在Protal下 [Home] > [Configuration] > [SQL Settings] > [General SQL Settings] 中的Lock Threshold中设置锁表阈值,如图2.1所示。
图2.1 General SQL Settings中设置页面
此类锁如果不及时处理将会对数据库和业务造成较大压力,通过Protal或terminal找到锁表信息Process对应的进程ID,如图2.2所示,在Protal下[Home] > [Processes]中搜索该ID号,如图2.3所示,找到对应进程后在Details中将其挂起或结束即可,如图2.4所示。若锁表信息Process对应的不是进程ID而是ECP名称如图2.5所示,则需查看ECP下的锁表信息,在ECP下的锁表信息可找到Process对应的进程ID,进行处理即可,如图2.5所示。
图2.2锁信息对应的进程ID
图2.3查找锁信息对应的进程ID
图2.4进程Details明细信息
图2.5锁信息Process对应的ECP信息
三、【Session锁】
此类锁为客户端产生数据插入数据库时,访问页面产生的Session锁。当访问页面长时间等待无响应则会产生类型为WaitExclusiveExact的锁,待页面响应或超时自动退出后WaitExclusiveExact锁消失。
主要作用
保证客户端访问的CSP页面与数据库建立会话链接,在写入或修改数据完成后自动释放,以固定形式命名^%cspSession(“xxxxxxx”),如图3.1所示。
图3.1 session示例
四、【仪器锁】
检验或检查设备需要与Cache数据库进行长时间不中断传输,则会产生仪器锁。
主要作用
保证仪器产生的结果数据及时回传至数据库,当仪器控制重启后会重新产生新的仪器锁,无需特殊处理。检验仪器锁以固定形式命名^MILOCK(n),如图4.1所示。
图4.1 仪器锁示例
五、【程序文件锁】
类文件、CSP文件在Studio中处于编辑状态,则会产生该文件对应的程序文件锁。
主要作用
避免不同工程师在同时处理同一个程序时,编译后产生不一致程序的现象发生。该类型锁以固定形式命名^oddDEF("程序名称"),如图5.1所示。经确认没有人同时操作同一程序,点击Remove即可解除此类锁。
图5.1 程序锁示例
总结:数据锁为Cache中最活跃的锁,找到锁表对应相同进程ID即找到了所谓的“根”锁,遇到故障时及时找到“根”锁,有助于定位异常进程,及时释放数据库压力,避免出现业务故障。同时避免程序中产生大批量超过阈值的数据插入或修改,是杜绝堆积锁产生的关键。根据Cache数据库负载的业务量,实时观察锁的变化情况,也是监控数据库的有效方式。本文介绍不全或有误的欢迎小伙伴评论补充。