Если я правильно понимаю, Progress 4GL NO-LOCK аналогичен команде TSQL WITH (NOLOCK). Идея состоит в том, что вы хотите получить как можно больше записей как можно быстрее и избежать конкуренции за ресурсы, которая может возникнуть при использовании SHARE-LOCK для записей, которые вы не собираетесь редактировать в любом случае. Теперь в TSQL вас предупреждают, что изменения, которые происходят во время выполнения запроса TSQL, могут быть пропущены; Я не совсем уверен, относится ли это к Progress 4GL / ABL. Я знаком с Progress 9 и OpenEdge 10/11. Progress Experts, поправьте меня, если я слишком далеко от базы. Я все еще немного новичок в этом.
В конструкции FOR-EACH сделайте это перед ключевыми словами BREAK
или BY
(ключевое слово by
похоже на order
в SQL), но после предложения where
:
FOR EACH TableName
WHERE TableName.x > 10
AND TableName.y
NO-LOCK BREAK BY TableName.x:
/* Do Code */
END.
ЕСЛИ используя FOR-EACH с дополнительным запросом EACH / FIRST / LAST (при условии подписки таблицы / вложенной таблицы MailSubscription), вы можете установить уровень для каждого подзапроса. В этом примере мне нужно пролистать записи подписки, найти связанные записи MailSubscription и отредактировать окончательную, не имеющую окончания срока действия запись, исключив при работе над ней все остальные, но оставив основную подзапись открытой для редактирования другими.
FOR EACH Subscription
WHERE ProductID = 'DB'
AND Subscriber
AND GetsPaper
NO-LOCK,
LAST MailSubscription OF Subscription
WHERE MailSubscription.EndDate = ?
EXCLUSIVE-LOCK
BREAK BY Subscription.SubscriptionID:
/* Fix broken MailSubscription records */
END.
В конструкции FIND-FIRST / FIND-LAST сделайте это после где и до NO-ERROR (при условии, что вы используете конструкцию IF-AVAILABLE). Помните, что если вам нужно получить две разные записи из одной таблицы, определите буфер хотя бы для одной из них.
FIND FIRST TableName WHERE TableName.x > 10 AND TableName.y NO-LOCK NO-ERROR.
IF AVAILABLE TableName THEN DO:
/* Do Code */
END.
Вы также можете заменить NO-LOCK
на EXCLUSIVE-LOCK
взаимозаменяемо. Вероятно, мне следует привести здесь цитату о великой власти / большой ответственности, но если у вас есть доступ к редактору Progress, вы, вероятно, уже получили его от своего администратора. Быть в безопасности.
Я рекомендую резервные копии в Интернете, если у вас достаточно новая версия Progress. Онлайн в смысле БД не используется для резервного копирования в онлайн-хранилище, а не для резервного копирования в облачном хранилище или чего-либо еще.