感谢您阅读本文.
我在设置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来查询数据并没有失败.从那以后我们就有了,我认为解决了这个问题,但我想知道我是否正在为自己的问题做好准备.
谢谢
由于您的问题更像是对SAS中数据访问和并发性的一般建议的请求,我的答案将形成一般建议,而不仅仅是一个特定的解决方案.
有优秀的SAS在线文档.请访问索引,并找到与您进一步阅读相关的信息.
请进一步查看" ACCESS=READONLY
"libname选项.它几乎完成了它所说的内容,即将对libname中数据成员的访问限制为只读.这样做的好处是,在非更改查询期间不会意外更改数据.它还使SAS能够为数据更改查询留出一些空间,以获得更高级别的数据控制.
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进程,则此设置最佳运行.
您还可以使用LOCK语句或LOCK命令锁定您的libname.这意味着您的SAS程序可以确保自己对libname的独占访问权限,以防您需要.然后,其他SAS进程可以使用lock命令查询特定的libname,并查看它是否可以获得(独占)访问权限.
您还可以控制数据成员级别的访问权限.这是通过CNTLLEV数据集选项完成的.例如," DATA LIB.MYDATA(CNTLLEV=LIB);
"指定访问控制位于库级别,限制对库的一个更新过程的并发访问.CNTLLEV=MEM
并分别CNTLLEV=REC
限制成员级别和记录级别的并发访问.
这些选项可以以多种不同的方式组合,为您提供大量空间,使您可以根据需要进行细粒度访问.我希望这些选择能帮助您完成任务.