Я сочувствую желанию предоставить пользователю приятное сообщение о том, кто держит блокировку.Но kbase не шутит.Это очень плохая идея использовать _LOCK таким образом.
11.4 + делает его менее плохим, но это все еще очень болезненно делать в большой производственной системе.
Появится«в порядке» в небольшой системе с размером таблицы блокировки по умолчанию (-L 8192).В большой активной системе с большой таблицей блокировок (обычные значения -L к северу от 1M) и большим количеством используемых блокировок у вас будет очень, очень разный и очень отрицательный опыт.
Лучшее решение можетчтобы посмотреть на "заблокированных пользователей":
for each dictdb._Connect no-lock
where _Connect-usr <> ?
and _Connect-wait <> " -- ": /* there are spaces around the '--' */
display _Connect.
end.
Это будет намного быстрее и может рассказать вам все, что вам нужно знать.
Если вы собираетесь сканировать _LOCK независимо от того, кто из kbaseпредупреждение, по крайней мере, поместит некоторую логику в ваш цикл, чтобы отследить, сколько времени это займет, и выручить, если это станет слишком длинным.Примерно так может быть хорошим началом:
etime( yes ).
for each dictdb._Lock where _Lock._Lock-usr <> ? and _Lock._Lock-recid <> ?:
if etime > 500 then leave.
/* whatever ... */
end.