2014-10-01 4 views
1

Я хотел бы спросить, есть ли способ отображения текущего типа блокировки моего буфера в окне сообщения. Есть ли способ сделать это?Progress 4GL Display Buffer Lock Тип

Я просто хочу проверить, какой тип замка есть в моем буфере во время выполнения.

Например: MESSAGE STRING(myBuffer:LOCK-TYPE).
Выход: NO-LOCK/SHARE-LOCK/EXCLUSIVE-LOCK

ответ

1

не напрямую.

Вы можете использовать функцию LOCKED (bufferName) (или связанный атрибут объекта handle buffer), чтобы увидеть, заблокирована она или нет, но вы не можете различать SHARE и EXCLUSIVE таким образом.

Действительно, этого должно быть достаточно - если оно не заблокировано, вы не вызываете проблем для других людей. Если он заблокирован, независимо от общего или эксклюзивного, то никто не может его заблокировать. Это ваше удовольствие, если вы изначально попросили его EXCLUSIVE-LOCK. Если вам не удалось указать тип блокировки или если вы явно сказали SHARE-LOCK и теперь хотите обновить блокировку, вы должны использовать таблицу FIND CURRENT EXCLUSIVE-LOCK. Если вы получаете обновление, у вас есть эксклюзивная блокировка. Если нет, то это был либо NO-LOCK, либо SHARE-LOCK (который вы бы знали из вашего предыдущего теста).

В теории вы можете быть в состоянии сканировать _lock VST и анализировать информацию в нем, но это долгий путь от простой функции, которые могли бы удовлетворять требования говорилось со словом «просто» :)

Это также очень опасно - _LOCK VST изменчиво (записи приходят и уходят быстрее, чем их можно прочитать), и очень легко написать код, который, кажется, работает в разработке, но который переваривает огромное количество процессорного времени в производственных ситуациях. Не пытайтесь. Это не закончится хорошо.

Если вы настаиваете на игнорирование меня, по крайней мере работать из снимка, созданного таким образом:

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. 

Обратите внимание на использование, а в каждой из них. Если вы проигнорируете меня и попробуете такой подход, я настоятельно рекомендую вам экспериментировать. Вы обнаружите, что WHILE намного быстрее, чем все, что вы можете сделать с критериями WHERE.

«Если я> 10000, то уходи». является губернатором. У вас должно быть что-то подобное в любом коде, который касается _LOCK. Это мешает ему случайно сходить с ума в системах PROD с большими столами блокировки.

Независимо от того, насколько вы думаете, что хотите сделать это, вы делаете ошибку. Пожалуйста, не ходите туда. Поэкспериментируйте, если вы хотите понять проблемы, или вы ищете проблему в своей среде разработки, но, пожалуйста, не ставьте этот код в производство.

+0

Из документов: LOCKED() возвращает значение TRUE, если запись недоступна предыдущему FIND. , , NO-WAIT, потому что * другой пользователь * заблокировал запись. Например, я попробовал следующий код на sports2000 db и получил «нет» в качестве ответа. найти эксклюзивный замок для клиентов. сообщение заблокировано (клиент) - как предупреждение. Это означает, что он не может использоваться в качестве общей проверки, чтобы увидеть, что в текущей программе или сеансе запись заблокирована где-то. Его можно использовать после FIND EXCLUSIVE-LOCK NO-WAIT. чтобы убедиться, что это сработало. –

+0

Если кто-то еще заблокировал это, вы этого не сделаете. Если никто другой не может ... –

Смежные вопросы