如何识别其他用户在正在进行的记录中获取的锁定

时间:2015-03-05 16:14:24

标签: progress-4gl openedge

用户A已从客户表中读取第一条记录。用户B希望知道A在记录上持有的锁。 B将如何以编程方式识别用户A持有的锁。

3 个答案:

答案 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是可以的,但您必须使用相应版本的相应代码:

  • _LOCK始终具有-L中给出的全部条目数,无论当前存在多少个锁。
  • 在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;运算符一起使用。)

  • 在11.5和11.6中,两种变体都应该有效,但带有where短语的较新变体应该更快。