【发布时间】:2014-10-03 04:16:29
【问题描述】:
我想问是否有办法在消息框中显示我的缓冲区的当前锁定类型。有没有办法做到这一点?
我只是想在运行时检查我的缓冲区上有什么类型的锁。
例如:MESSAGE STRING(myBuffer:LOCK-TYPE).
输出:NO-LOCK/SHARE-LOCK/EXCLUSIVE-LOCK
【问题讨论】:
标签: progress-4gl openedge
我想问是否有办法在消息框中显示我的缓冲区的当前锁定类型。有没有办法做到这一点?
我只是想在运行时检查我的缓冲区上有什么类型的锁。
例如:MESSAGE STRING(myBuffer:LOCK-TYPE).
输出:NO-LOCK/SHARE-LOCK/EXCLUSIVE-LOCK
【问题讨论】:
标签: progress-4gl openedge
不直接。
您可以使用 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 系统上意外发疯。
无论您多么想这样做,您都在犯错误。请不要去那里。如果您想了解问题或正在查看开发环境中的问题,请进行实验,但请不要将此类代码投入生产。
【讨论】: