代码之家  ›  专栏  ›  技术社区  ›  Jay Corbett

对于SAS数据集,防止多用户访问锁定的最佳方法是什么

sas
  •  5
  • Jay Corbett  · 技术社区  · 17 年前

    谢谢你阅读这篇文章。

    设置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;
    

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

    谢谢

    1 回复  |  直到 17 年前
        1
  •  7
  •   Martin Bøgelund    17 年前

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

    有优秀的SAS在线文档。请去参观 the index ,并找到与您进一步阅读相关的信息。

    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"
    3. 还可以使用lock语句或lock命令锁定libname。这意味着您的SAS程序可以确保自己拥有对libname的独占访问权限,以备不时之需。然后,其他SAS进程可以使用lock命令查询特定的libname,并查看它是否可以获得(独占)访问权限。
    4. 您还可以控制数据成员级别的访问。这是通过CNTLEV数据集选项完成的。例如“ DATA LIB.MYDATA(CNTLLEV=LIB); 指定访问控制在库级别,将并发访问限制为仅对库的一个更新进程。 CNTLLEV=MEM CNTLLEV=REC 分别在成员级别和记录级别限制并发访问。

    推荐文章