Операция параллелизма в прогрессе 4GL
REPEAT With FRAME:
prompt-for IN-SCAN3.scan.
if input IN-SCAN3.scan="" then Do:
Message "please input date.".
undo,retry.
end.
else DO:
FIND FIRST in-scan3 USING IN-SCAN3.scan NO-LOCK NO-WAIT NO-ERROR.
if avail In-scan3 then DO:
str="OK".
display str.
next-prompt IN-SCAN3.scan.
end.
else DO:
CREATE In-scan3.
ASSIGN IN-scan3.scan=INPUT in-scan3.scan.
str="NO". DISPLAY str.
next-prompt In-scan3.scan.
END.
end.
begin=begin + 1.
end.
Вопрос: 20 пользователей одновременно используют сканирование, сначала находят входные данные, если они не найдены, а затем создают одну запись в базе данных. Вопрос в том, что при работе появится мертвая блокировка. Я пытаюсь NO-LOCK NO-WAIT с записью, когда найти, операционная появится тупиковая блокировка при создании записи.
спасибо любой ответ.
1 ответ
Вы, к сожалению, не справились с основной "ошибкой" ABL - по умолчанию для блокировки записи будет использоваться SHARE-LOCK, даже если вы укажете иначе, и это, вероятно, не то, что вам нужно.
Основное правило заключается в том, что если ваша область транзакции меньше, чем область вашей записи, то запись будет возвращаться к SHARE-LOCK, когда вы выходите из транзакции. Но я рекомендую вам прочитать соответствующую главу в руководстве ABL.
Есть несколько способов исправить это. Ключевое слово RELEASE - одно. Но я склоняюсь к идее, что вы должны использовать отдельный буфер для фактической блокировки записи. Таким образом, вы делаете вещи очень понятными для других программистов.
Например:
def buffer b-in-scan3 for in-scan3.
repeat:
prompt-for in-scan3.scan.
/*** etc. ***/
else
do for b-in-scan3 transaction:
find first b-in-scan3 using in-scan3.scan
exclusive no-wait no-error.
if not avail b-in-scan3
and not locked b-in-scan3
then
do:
create b-in-scan3.
b-in-scan3.scan = input in-scan3.scan.
end.
end. /* of transaction */
end. /* of repeat */
Таким образом, если другой программист использует b-inscan3 за пределами вашего блока транзакции, программа не сможет скомпилировать, а не начнет возвращаться к SHARE-LOCK.
Помните, что вы можете проверить LOCKED, а также AVAILABLE, но если запись заблокирована, то она недоступна.