Операция параллелизма в прогрессе 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, но если запись заблокирована, то она недоступна.

Другие вопросы по тегам