首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYLIB.SASMACR.CATALOG无法使用锁

MYLIB.SASMACR.CATALOG无法使用锁
EN

Stack Overflow用户
提问于 2018-06-05 08:50:05
回答 2查看 1.9K关注 0票数 2

我有一个存储的已编译宏库,即定义如下的宏:

代码语言:javascript
复制
options mstored sasmstore=MYLIB;

%macro say_something(txt) / STORE SOURCE;
%put &txt;
%mend;

我经常收到这样的错误消息:

注意: SAS系统无法打开SASMSTORE = libref引用的宏库。 错误: MYLIB.SASMACR.CATALOG无法使用锁。 错误:由进程4653302持有的锁。 错误:将编译一个虚拟宏。

当我试图定义一个宏(例如,执行上面的代码)时就会发生这种情况,我相信它发生在以下两种情况下:

  1. 在已定义宏的情况下,将打开另一个会话。
  2. 使用我的库中的宏打开进程当前正在运行的另一个会话。

(但我并不完全清楚)

我能避免这样吗?

在第一种情况下,我想放弃写作权,以便另一个会话可以使用它们。我现在是通过关闭文件并重新打开它来完成的,如果我错误地在“重新启动”之前对这个文件启动了一个很长的过程,这是非常乏味和烦人的。

在第二种情况下,我真的不明白为什么锁会发生,因为我几乎不使用宏,没有向库写入任何东西。由于我的库将被更多的人使用,我需要找到提交的“合适的时间”,这实际上不是我正在寻找的干净的工作流。

EN

回答 2

Stack Overflow用户

发布于 2018-06-05 09:00:46

我的建议是停止使用存储的已编译宏,而是使用sasautos选项使用自动调用宏文件夹。然后,您可以在任何时候进行更改,而不必担心锁。任何已经运行的会话都需要重新加载宏才能获得新的定义。

票数 4
EN

Stack Overflow用户

发布于 2018-06-05 14:50:57

其中有些可能需要不同的工作流,但可能是“正确”的工作流。

特别是(2)。您不应该写入同事正在读取的宏目录。相反,您应该写入本地宏目录,然后定期提交到源代码管理(或者,如果您正在执行“手动”源代码管理,则定期将其复制到生产位置)。这也允许在部署之前进行适当的测试。在这里,定期可能意味着“一天一次”,或者更少,这取决于您的开发周期。

否则,您可能会对同事正在使用的宏进行更改,而他们可能不理解这种更改,或者可能不知道他们是否运行了宏的前、后版本--这也同样糟糕。

这在很大程度上也会防止(1);如果每个SAS会话只写入本地副本(到该会话或用户),那么您就不会有太多冲突的实例。当然,您可以使用SAS的两个实例来编写同一个实例,但这是您应该避免的事情。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50695952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档