我想询问是否有办法在消息框中显示我的缓冲区的当前锁定类型。有没有办法做到这一点?
我只是想在运行时检查缓冲区上有什么类型的锁。
例如:MESSAGE STRING(myBuffer:LOCK-TYPE).
输出:NO-LOCK/SHARE-LOCK/EXCLUSIVE-LOCK
答案 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系统上意外疯狂。
无论你认为自己想做多少,都犯了一个错误。请不要去那里。如果您想了解问题或者在开发环境中查看问题,请尝试进行实验,但请不要将此类代码投入生产。