Progress 4GL显示缓冲锁定类型

时间:2014-10-01 08:06:31

标签: progress-4gl openedge

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

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

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

1 个答案:

答案 0 :(得分:1)

不直接。

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

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

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

它也非常危险 - _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标准可以做的任何事情都要快得多。

&#34;如果我&gt; 10000然后离开。&#34;是州长。你应该在任何触及_LOCK的代码中都有类似的东西。它可以防止它在具有大锁表的PROD系统上意外疯狂。

无论你认为自己想做多少,都犯了一个错误。请不要去那里。如果您想了解问题或者在开发环境中查看问题,请尝试进行实验,但请不要将此类代码投入生产。