【问题标题】:Progress 4GL Display Buffer Lock TypeProgress 4GL 显示缓冲区锁定类型
【发布时间】:2014-10-03 04:16:29
【问题描述】:

我想问是否有办法在消息框中显示我的缓冲区的当前锁定类型。有没有办法做到这一点?

我只是想在运行时检查我的缓冲区上有什么类型的锁。

例如:MESSAGE STRING(myBuffer:LOCK-TYPE).
输出:NO-LOCK/SHARE-LOCK/EXCLUSIVE-LOCK

【问题讨论】:

    标签: progress-4gl openedge


    【解决方案1】:

    不直接。

    您可以使用 LOCKED(bufferName) 函数(或缓冲区句柄对象的相关属性)来查看它是否被锁定,但您无法区分 SHARE 和 EXCLUSIVE。

    真的应该足够了——如果它没有被锁定,那么你就不会给其他人带来任何问题。如果它被锁定,无论共享还是独占,那么其他人都无法锁定它。如果您最初要求 EXCLUSIVE-LOCK,您可以尽情享受。如果您未能指定锁类型,或者如果您明确表示 SHARE-LOCK 并且现在想要升级锁,您应该使用 FIND CURRENT table EXCLUSIVE-LOCK。如果您获得升级,您将获得排他锁。如果不是,那么它是 NO-LOCK 或 SHARE-LOCK(您可以从之前的测试中知道)。

    理论上,您可能能够扫描 _LOCK VST 并解析其中的信息,但这距离一个可能满足“just”一词的要求的简单函数还有很长的路要走:)

    这也是非常危险的——_LOCK VST 是易变的(条目来来去去的速度比它们可以读取的快)并且很容易编写看起来在开发中工作但会占用大量 CPU 时间的代码在生产情况下。不要尝试。结局不会很好。

    如果你坚持不理我,至少从这样创建的快照中工作:

    define variable i as integer no-undo.
    
    define temp-table tt_lock no-undo like _lock
      index id-idx is unique primary _lock-id
      index recid-idx _lock-recid
      index usr-idx _lock-usr
      index tbl-idx _lock-table
    .
    
    empty temp-table tt_lock.
    
    for each _lock while _lock._lock-usr <> ?:
    
      i = i + 1.
      if i > 10000 then leave.
    
      create tt_lock.
      buffer-copy _lock to tt_lock no-error.
    
    end.
    

    注意在 FOR EACH 中使用 WHILE。如果您忽略我并尝试这种方法,我敦促您进行实验。您会发现 WHILE 比使用 WHERE 条件执行的任何操作都快得多。

    “如果 i > 10000 则离开”。是州长。在任何涉及 _LOCK 的代码中都应该有类似的东西。它可以防止它在具有大型锁表的 PROD 系统上意外发疯。

    无论您多么想这样做,您都在犯错误。请不要去那里。如果您想了解问题或正在查看开发环境中的问题,请进行实验,但请不要将此类代码投入生产。

    【讨论】:

    • 来自文档: LOCKED() 如果记录不可用于先前的 FIND ,则返回 TRUE 值。 . . NO-WAIT 语句,因为 另一个用户 已锁定记录。例如,我在 sports2000 db 上尝试了以下代码并得到“否”作为响应。找到第一个客户排他锁。消息锁定(客户)视图作为警报框。这意味着它不能用作通用检查以查看当前程序或会话是否在某处锁定了记录。它可以在 FIND EXCLUSIVE-LOCK NO-WAIT 之后使用。看看这是否有效。
    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多