我想问是否有办法在消息框中显示缓冲区的当前锁类型。有办法做到这一点吗?
我只想在运行时检查缓冲区上有什么类型的锁。
例如:MESSAGE STRING(myBuffer:LOCK-TYPE).
输出:NO-LOCK/SHARE-LOCK/EXCLUSIVE-LOCK
不直接。
您可以使用LOCKED(bufferName)函数(或缓冲区句柄对象的相关属性)来查看它是否被锁定,但无法通过这种方式区分SHARE和EXCLUSIVE。
真的,这应该足够了——如果它没有被锁定,那么你就不会给其他人带来任何问题。如果它被锁定了,无论是共享的还是独占的,那么没有人可以锁定它。如果你最初要求它exclusive-lock,它就是你的。如果您未能指定锁类型,或者如果您明确表示SHARE-lock,并且现在想要升级锁,则应使用FIND CURRENT表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,则离开。"是一位州长。在任何toucjes_LOCK的代码中都应该有类似的东西。它可以防止它在具有大型锁表的PROD系统上意外地变得疯狂。
无论你多么想这样做,你都在犯错误。请不要去那里。如果你想了解这些问题,或者你在开发环境中看到了一个问题,请尝试一下,但请不要把这种代码放在生产中。