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

时间:2009-02-21 15:56:05

标签: sas

感谢您阅读本文。

我在设置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 个答案:

答案 0 :(得分:7)

由于你的问题更像是关于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 LIB SERVER=SHARELIB"的libname(请注意,没有物理路径 - SAS / SHARE服务器进程需要注意那个)。如果您的SAS / SHARE服务器具有单独的SAS进程,则此设置将发挥最佳功能。
  3. 您还可以使用LOCK语句或LOCK命令锁定您的libname。这意味着您的SAS程序可以确保自己对libname的独占访问权限,以防您需要。然后,其他SAS进程可以使用lock命令查询特定的libname,看看它是否可以获得(独占)访问权限。
  4. 您还可以控制数据成员级别的访问权限。这是通过CNTLLEV数据集选项完成的。例如,“DATA LIB.MYDATA(CNTLLEV=LIB);”指定访问控制位于库级别,限制对库的一个更新过程的并发访问。 CNTLLEV=MEMCNTLLEV=REC分别限制成员级别和记录级别的并发访问。
  5. 这些选项可以通过多种不同方式组合,为您提供大量空间,使您可以根据需要进行细粒度访问。我希望这些选择能帮助你完成任务。