我有一个存储的已编译宏库,即定义如下的宏:
options mstored sasmstore=MYLIB;
%macro say_something(txt) / STORE SOURCE;
%put &txt;
%mend;我经常收到这样的错误消息:
注意: SAS系统无法打开SASMSTORE = libref引用的宏库。 错误: MYLIB.SASMACR.CATALOG无法使用锁。 错误:由进程4653302持有的锁。 错误:将编译一个虚拟宏。
当我试图定义一个宏(例如,执行上面的代码)时就会发生这种情况,我相信它发生在以下两种情况下:
(但我并不完全清楚)
我能避免这样吗?
在第一种情况下,我想放弃写作权,以便另一个会话可以使用它们。我现在是通过关闭文件并重新打开它来完成的,如果我错误地在“重新启动”之前对这个文件启动了一个很长的过程,这是非常乏味和烦人的。
在第二种情况下,我真的不明白为什么锁会发生,因为我几乎不使用宏,没有向库写入任何东西。由于我的库将被更多的人使用,我需要找到提交的“合适的时间”,这实际上不是我正在寻找的干净的工作流。
发布于 2018-06-05 09:00:46
我的建议是停止使用存储的已编译宏,而是使用sasautos选项使用自动调用宏文件夹。然后,您可以在任何时候进行更改,而不必担心锁。任何已经运行的会话都需要重新加载宏才能获得新的定义。
发布于 2018-06-05 14:50:57
其中有些可能需要不同的工作流,但可能是“正确”的工作流。
特别是(2)。您不应该写入同事正在读取的宏目录。相反,您应该写入本地宏目录,然后定期提交到源代码管理(或者,如果您正在执行“手动”源代码管理,则定期将其复制到生产位置)。这也允许在部署之前进行适当的测试。在这里,定期可能意味着“一天一次”,或者更少,这取决于您的开发周期。
否则,您可能会对同事正在使用的宏进行更改,而他们可能不理解这种更改,或者可能不知道他们是否运行了宏的前、后版本--这也同样糟糕。
这在很大程度上也会防止(1);如果每个SAS会话只写入本地副本(到该会话或用户),那么您就不会有太多冲突的实例。当然,您可以使用SAS的两个实例来编写同一个实例,但这是您应该避免的事情。
https://stackoverflow.com/questions/50695952
复制相似问题