5

感谢您阅读本文。

我在设置 libref 时使用共享服务 (server=sharedLib),以允许我的 SAS/IntrNet 应用程序的用户修改和更新(添加新)单个数据集的记录。该应用程序还将用于查询我的数据集。为了最大限度地减少锁定,我只使用数据步骤来修改和更新,而不是使用 Proc SQL(锁定整个成员)。但是,我想知道如果仅更新/修改对数据的访问使用共享服务但查询不使用,锁定的可能性或多或少。

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

这不是我的实际代码,但我确实知道请求是否只是将数据发回或修改现有记录或添加新记录(更新);

我最初做出这种区分是因为我们在连接到共享服务时遇到了一些故障(不确定这是正确的术语),但是引用库来查询数据并没有失败。从那时起,我认为解决了这个问题,但我想知道我是否正在为问题做好准备。

谢谢

4

1 回答 1

7

由于您的问题更像是对 SAS 中数据访问和并发性的一般建议的请求,因此我的回答将形成一般建议,而不是具体解决方案。

有优秀的 SAS 在线文档。请访问索引,并找到相关信息以供您进一步阅读。

  1. 请进一步查看 " ACCESS=READONLY" libname 选项。它几乎做到了它所说的,即将对 libname 中数据成员的访问限制为只读。这样做的好处是您不会在非更改查询期间意外更改数据。它还使 SAS 能够为数据更改查询留出一些空间,以便对数据进行更高级别的控制。
  2. SAS/SHARE 支持并发数据访问,因此如果您需要提供对相同数据的并发访问(读/写),SAS/SHARE 是一个不错的选择。这意味着您可以只分配一次 libname,为您的 libname 语句提供选项“ SERVER=SHARELIB”,并让 SAS/SHARE 管理并发数据访问。如果您将 libname 分配给您的 SAS/SHARE 服务器进程,则需要访问此 libname 的所有后续 SAS 进程只需分配 libname,例如"LIBNAME LIB SERVER=SHARELIB"(注意没有物理路径 - SAS/SHARE 服务器进程负责处理)。如果您的 SAS/SHARE 服务器有单独的 SAS 进程,此设置将发挥最佳作用。
  3. You can also lock your libname with the LOCK statement or the LOCK command. This means that your SAS program can ensure itself exclusive access rights to a libname, in case that's what you need. Other SAS processes can then use the lock command to query a specific libname and see if it can get (exclusive) access.
  4. You can also control access on the data member level. This is done with the CNTLLEV data set option. For example "DATA LIB.MYDATA(CNTLLEV=LIB);" specifies that access control is at the library level, restricting concurrent access to only one update process to the library. CNTLLEV=MEM and CNTLLEV=REC restricts concurrent access at member level and record level respectively.

These options can be combined in many different ways, giving a lot of room for you to make access as fine-grained as you need. I hope these choices will help you complete your task.

于 2009-03-11T12:41:48.477 回答