Изменить блокировку по умолчанию в Progress вместо Share-lock - PullRequest
2 голосов
/ 22 августа 2009

Как мы можем изменить блокировку по умолчанию в Progress вместо Share-lock?

Ответы [ 2 ]

11 голосов
/ 24 августа 2009

Вы можете изменить его для каждого отдельного запроса (НАЙТИ, ДЛЯ КАЖДОГО и т. Д.), Добавив в запрос статус блокировки с помощью модификатора [NO | EXCLUSIVE | SHARE] -LOCK. Если вы отключите эту опцию, вы получите SHARE-LOCK по умолчанию.

Вы также можете скомпилировать код в сеансе, запущенном с параметром -NL, который меняет значение по умолчанию для этого r-кода на NO-LOCK.

0 голосов
/ 05 января 2015

Если я правильно понимаю, 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. Онлайн в смысле БД не используется для резервного копирования в онлайн-хранилище, а не для резервного копирования в облачном хранилище или чего-либо еще.

...