Для набора данных SAS, какой лучший способ предотвратить блокировку для многопользовательского доступа - PullRequest
5 голосов
/ 21 февраля 2009

Спасибо, что прочитали это.

Я использую общую службу (server = sharedLib) при настройке моего libref, чтобы позволить пользователям моего приложения SAS / IntrNet изменять и обновлять (добавлять новые) записи одного набора данных. Приложение также будет использоваться для запроса моего набора данных. Чтобы минимизировать блокировку, я использую только шаг данных для изменения и обновления, а не Proc SQL (который блокирует весь элемент). Однако мне интересно, является ли блокировка более или менее вероятной, если только обновление / изменение доступа к данным использует службу общего доступа, а запросы - нет.

%if &type=QUERY %then %do ;
 LIBNAME lib '/myServer/library' ;
%end ;
%else %do ;
 LIBNAME lib '/myServer/library' server=shareLib ;
%end;

это не мой настоящий код, но я знаю, собирается ли запрос просто отправить данные обратно или изменить существующую запись или добавить новую запись (обновление);

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

Спасибо

1 Ответ

7 голосов
/ 11 марта 2009

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

Есть отличная документация SAS онлайн. Перейдите на страницу указатель и найдите информацию, необходимую для дальнейшего чтения.

  1. Пожалуйста, ознакомьтесь с опцией "ACCESS=READONLY" libname. Он в значительной степени делает то, что говорит, а именно ограничивает доступ к элементам данных в имени библиотеки только для чтения. Это дает преимущество, заключающееся в том, что вы не изменяете свои данные случайно во время неизменяющегося запроса. Это также позволяет SAS оставить некоторое пространство для запросов на изменение данных, чтобы получить более высокий уровень контроля над данными.
  2. SAS / SHARE обеспечивает одновременный доступ к данным, поэтому, если вам необходимо обеспечить одновременный доступ (чтение / запись) к одним и тем же данным, SAS / SHARE является хорошим выбором. Это означает, что вы можете назначить свое имя только один раз, указав свой оператор libname опцию "SERVER=SHARELIB", и SAS / SHARE будет управлять одновременным доступом к данным. Если вы назначаете имя библиотеки вашему процессу сервера SAS / SHARE, все последующие процессы SAS, которым необходим доступ к этому имени библиотеки, должны назначить имя библиотеки только как "LIBNAME LIB SERVER=SHARELIB" (обратите внимание, что нет физического пути - процесс сервера SAS / SHARE позаботится об этом. ). Эта настройка работает наилучшим образом, если у вас есть отдельный процесс SAS для вашего сервера SAS / SHARE.
  3. Вы также можете заблокировать ваше libname с помощью оператора LOCK или команды LOCK. Это означает, что ваша SAS-программа может обеспечить себе эксклюзивные права доступа к имени библиотеки в случае, если это то, что вам нужно. Затем другие процессы SAS могут использовать команду блокировки для запроса определенного имени библиотеки и проверки возможности получения (эксклюзивного) доступа.
  4. Вы также можете контролировать доступ на уровне элемента данных. Это делается с помощью опции набора данных CNTLLEV. Например, «DATA LIB.MYDATA(CNTLLEV=LIB);» указывает, что управление доступом находится на уровне библиотеки, ограничивая одновременный доступ только к одному процессу обновления библиотеки. CNTLLEV=MEM и CNTLLEV=REC ограничивают одновременный доступ на уровне участника и уровне записи соответственно.

Эти параметры можно комбинировать различными способами, предоставляя вам достаточно места, чтобы сделать доступ к ним более детальным, чем вам нужно. Я надеюсь, что этот выбор поможет вам выполнить вашу задачу.

...