IRIS / Chronicles 数据处理中的 Lock (锁)

在数据库中,如何保持数据库中的数据一致性,我们通常在关系数据库中都知道使用一个叫做事务的东西。

IRIS 这个数据库就有点简单粗暴了,它们是通过锁来实现事务的。

流程就是当你要对数据库进行操作了,包括更新等操作,你首先需要对你需要操作的数据进行 Lock,然后操作数据,然后再释放 Lock。

没有释放 Lock 怎么办

IRIS 中,如果你没有释放 Lock,那么会导致你的这个记录被长期锁定,没有任何进程能够对你锁定的记录进行操作,直到锁被释放。

Lock 记录在哪里

在 IRIS 中有一个全局的锁记录表。

当任何进程需要对记录进行操作的时候,都会在这个 Lock 记录表中创建一个 Lock 记录。

让完成数据操作后,Lock 记录会被从 Lock 表中删除。

正是因为这样,IRIS 给了我们一个机会来查看我们系统中的表,这个是通过系统工具中的 Utilities 来实现的。

例如,我们查询 IRIS 中的锁,可能会返回下面的记录:

SWTDREL> d searchLocks^%ZdTOOLS("ER1")
Entry Owner X# Item Locked
125 27486 1 ^["^^/epic/train01/train/app/"]ER1EAF(10,"AR‐PROF")
126 27695 1 ^["^^/epic/train01/train/app/"]ER1EMP(" 1")

我们针对上面的数据进行一些解释:

Entry : 是记录号,等于我们当前表中记录 Lock 的数量,这个就等于在关系数据库中常说的主键,PK。
Owner :是进程号,用来表示的是当前那个进程锁定了这个记录。
ER1:是环境号,通常这个数据不重要,因为每个环境可能不一样,主要是为了标识全局环境在哪里。
EMP:数据库名,如你对前面有关 IRIS 的数据结构有所了解的话,那么 EMP 应该就知道对应的是 INI,表示的是那个数据库中存在锁。
10:记录,对应的是当前这个数据库中的那个 Record 被锁定了。
AR‐PROF:子锁定级别,因为我们只对 IRIS 进行一些初步的了解,所以对子锁的定义不详细说明。

敲黑板,根据 IRIS 的官方说明,当需要对 Lock 进行操作或者删除的时候,不要使用 Entry ,真正的原因是这个 Lock 表是动态更新的,很有可能在你还在查询的时候 Entry ID 有了改变。

锁定表说明

上面的表显示了锁定的表的数据。

进一步查询

对于下面的记录,如果我想了解是那个数据库被锁定了。我们的搜索字符串为 ZPT

154   21314 1  ^["^^/epic/data01/fndexb/app/"]ER1ZPT(" 14562")
155   31352 1  ^["^^/epic/data01/fndexb/app/"]ER1ZPT(" 100062")