用户A已从客户表中读取第一条记录。用户B希望知道A在记录上持有的锁。 B将如何以编程方式识别用户A持有的锁。
答案 0 :(得分:1)
您可以使用LOCKED
功能:
如果记录不适用于先前的FIND,则返回TRUE值。 。 。 NO-WAIT语句,因为另一个用户已锁定记录。
文档示例:
REPEAT:
PROMPT-FOR customer.cust-num.
FIND customer USING customer.cust-num NO-ERROR NO-WAIT.
IF NOT AVAILABLE customer THEN DO:
IF LOCKED customer
THEN MESSAGE "Customer record is locked".
ELSE MESSAGE "Customer record was not found".
NEXT.
END.
DISPLAY cust-num name city state.
END.
其他例子:
FIND FIRST table
WHERE table.c1 = "foo"
EXCLUSIVE-LOCK NO-ERROR NO-WAIT.
IF LOCKED(table)
THEN DO:
/* The record is blocked by another user */
END.
ELSE DO:
IF AVAILABLE table
THEN DO:
/* The record can be modified */
END.
END.
答案 1 :(得分:1)
您可以使用内置的_Lock虚拟系统表。
这是一个基本的例子:
DEFINE TEMP-TABLE ttLock
FIELD LockId LIKE _Lock._Lock-Id
FIELD LockUsr LIKE _Lock._Lock-Usr
FIELD LockName LIKE _Lock._Lock-Name
FIELD LockTable LIKE _Lock._Lock-Table
FIELD LockFlags LIKE _Lock._Lock-flags
INDEX LockIdx IS PRIMARY UNIQUE LockId.
FOR EACH _Lock NO-LOCK:
IF _Lock._Lock-Usr = ? THEN NEXT .
CREATE ttLock.
ASSIGN
LockId = _Lock._Lock-Id
LockUsr = _Lock._Lock-Usr
LockName = _Lock._Lock-Name
LockTable = _Lock._Lock-Table
lockFlags = _Lock._Lock-flags.
END.
FOR EACH ttlock:
FIND _Trans NO-LOCK WHERE _Trans._Trans-Usrnum = ttLock.LockUsr NO-ERROR.
FIND _File NO-LOCK WHERE _File-Number = ttLock.LockTable.
MESSAGE
"Transaction Id:~t" (IF AVAILABLE _Trans THEN _Trans._Trans-Id ELSE ?) "~n"
"User Number:~t" ttLock.LockUsr "~n"
"User Name~t" ttLock.LockName "~n"
"Table Number:~t" ttLock.LockTable "~n"
"Table Name:~t" _File-Name "~n"
"Flags:~t" ttLock.LockFlags
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.
(直接来自this entry in the knowledgebase。)
在Database Administration指南中,您可以看到(第848页),您可以看到_Lock.LockFlags中的标记代表什么。
锁定标志 - 标志指定共享 锁(S),独占锁(X),锁升级 从分享到独家(U),锁定在(L), 一个排队的锁(Q),一个锁在一起 交易结束边界(K),锁是其中的一部分 一个JTAtransaction(J),一个锁处于创建模式 对于JTA(C),或者lockwait超时已过期 在这个排队的锁(E)
查询_Lock表可能只是您想在测试环境中执行的操作。根据您的系统大小,可能存在大量数据。另外,使用VST进行READ-ONLY操作!
答案 2 :(得分:-1)
在旧版本中查询_LOCK是可以的,但您必须使用相应版本的相应代码:
在11.4之前的版本中,字段未编入索引,但所有使用的锁都在表的开头,因此您可以使用
IF _Lock._Lock-Usr = ? THEN LEAVE.
每个循环中的(_Lock._Lock-Name =?也没关系)。请参阅http://knowledgebase.progress.com/articles/Article/P161995
在11.4和11.5中,填充的条目不再位于开头,因此旧代码将给出错误的结果(请参阅http://knowledgebase.progress.com/articles/Article/000056304,这在11.5.1中已修复)。幸运的是,扫描锁表现在要快得多,所以你可以使用
FOR EACH _Lock NO-LOCK WHERE _Lock-Recid <> ?:
在同一篇文章中提到。从技术上讲,这不是通过索引实现的。 (索引不能与&lt;&gt;运算符一起使用。)