文章
Yuxiang Niu · 十月 22, 2022 阅读大约需 4 分钟

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 ScheduleID1058的任务

二、【数据锁】

此类锁多为业务产生,在所有LOCK中占比最大。程序中可通过LOCK命令结合不同参数设定各种锁,例如增量锁,递减锁,共享锁,升级锁,立即解锁,延迟解锁,排他锁,独占锁(有兴趣的同学可以参考学习https://blog.51cto.com/yaoxin/4923409)

主要作用

是为了保证数据的有序写入、更改、删除,避免产生数据不一致的情况发生。

此类锁以不同的global名称、节点和ID命名:^Globalname(node,ID)。造成数据锁一般存在三种情况:

  1>当前global所在表被某个进程锁死,当前进程无法对数据进行insertupdatedelete

  2>当前global所在表处于编辑或编译状态;

  3>一个进程对某个表insertupdatedelete超过数据库阈值。

数据库阈值设置以ensemble2010版本为例:在Protal[Home] > [Configuration] > [SQL Settings] > [General SQL Settings] 中的Lock Threshold中设置锁表阈值,如图2.1所示。

 

2.1 General SQL Settings中设置页面

此类锁如果不及时处理将会对数据库和业务造成较大压力,通过Protalterminal找到锁表信息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数据库负载的业务量,实时观察锁的变化情况,也是监控数据库的有效方式。本文介绍不全或有误的欢迎小伙伴评论补充。

8
0 107
讨论 (0)1
登录或注册以继续