所以我有这个在线程序,它在PDS成员上写入数据(也被其他程序使用/访问过)。
COBOL"中的OPEN命令是否锁定"专用的PDS有点像IBM的ENQ / DEQ实用程序吗?所以当我使用它时,其他程序无法写入它?我在大型机zOS btw。
我已经测试过,但我对我的测试设置持怀疑态度。哪个是......
JCL > COBOL01 > COBOL02
...其中COBOL01打开PDS,调用COBOL02打开相同的PDS,然后在其上写入。结果是COBOL02无法在PDS上写入。
但是,如果它是一个在线交易,那该怎样呢?
答案 0 :(得分:1)
ENQ是文件分配的一部分,在您的情况下,由于JCL中status
语句的DISP
参数的DD
子参数而发生。< / p>
DISP=(status,normal-termination,abnormal-termination)
......或者,......
DISP=status
如果您编码DISP=OLD
,则您可以独占控制数据集。检查IBM Knowledge Center中PDS和PDSE行为之间的差异。
同样适用于在线交易,但您的分配可能会有不同的方式。如果您作为ISPF对话框的一部分运行,则可以通过ALLOCATE
命令完成分配。如果您在CICS中运行,则可以进行动态分配,或者更常见的是在PDS的情况下,可以通过CICS区域的JCL完成。
你说你打开PDS两次,你确定第二次打开实际上有效吗?如果您编写了FILE STATUS
子句,是否检查了指定的数据名称?在JESMSGLG
?
答案 1 :(得分:1)
我总是喜欢在这些类型的问题中深入挖掘,希望有些人可能会欣赏有时很难从外部看到的大型机操作系统设计部分......
正如您所推测的那样,在“锁定”的核心,您将找到z / OS ENQ / DEQ系统服务。这些函数提供了一种简单的方法来序列化任何资源,并且总是有两个参数:“QNAME”和“RNAME”。 QNAME标识资源类...在您的示例中,它将是SYSDSN - 数据集入队。 RNAME是资源名称,在您的示例中,它将是实际的数据集名称(如果数据集是PDS,则不包括成员名称)。
正如cschneid所解释的那样,当您分配传统的大型机数据集时,系统分配例程会在SYSDSN上使用数据集名称以及SHARED或EXCLUSIVE访问来发出ENQ,具体取决于您是否在分配中编码了DISP = SHR或其他内容。如果存在冲突(即,您请求了SHARED,但另一个任务具有EXCLUSIVE),ENQ将失败,您将在控制台上看到有关您的任务“等待数据集”的消息。否则,分配继续进行,ENQ会根据您在JCL中指定的DISP保护您。
还有一些其他情况要考虑......
PDS数据集有点不寻常,因为ENQ处于完整数据集级别,而不是成员级别。这意味着通常无法锁定单个成员 - 锁定位于完整数据集的级别。像ISPF编辑器这样的应用程序试图通过在不同的资源上创建自己的ENQ来解决这个问题。 ISPF编辑器将QNAME = SYSISPF与包含成员名称的RNAME一起使用,以检测同时编辑同一成员名称的两个用户,但这仅在ISPF用户之间提供保护,而不是ISPF用户和ISPF之外的其他应用程序。
VSAM有自己的共享概念,由VSAM SHAREOPTIONS在定义VSAM文件时设置。这使得共享类型成为文件的功能,而不是分配文件的应用程序。
ENQ可以是单一系统,也可以跨多个系统。系统GRS(全局资源共享)服务通常配置为在可能具有对数据集的物理访问权的所有系统中传播SYSDSN ENQ。
请注意,在我描述的ENQ中,没有磁盘卷信息。也就是说,如果在两个不同的卷上有一个名为XYZ的数据集,则无论您分配哪个数据集,分配数据集通常都会对它们进行序列化。这可能是一个功能或问题,具体取决于您如何看待它。
JCL分配与动态分配略有不同。通过动态分配,大多数应用程序不允许等待资源,因此如果发生冲突,您对DYNALLOC的调用将失败,并显示“资源不可用”返回代码。在JCL分配中,您通常只是等待资源争用清除,然后你的工作就开始了。
有一些流行的供应商产品可以改变这种流程......例如,CA的MIM产品会自动检测ENQ冲突并重新安排等待作业,以便在资源可用时执行。这可以提高整体系统吞吐量,因为可以运行其他任务。
复杂的应用程序有时会使用RESERVE / RELEASE服务来序列化对文件的访问。 RESERVE是大多数大型机设备的硬件功能,它实质上将I / O序列化到给定设备,直到相应的RELEASE。它通常需要低级I / O编程,但它可能比ENQ / DEQ更快,特别是在有许多系统共享资源的环境中。
大多数系统性能监视器都有一个功能,可以让您查看和监视ENQ活动......您可以通过观察ENQ的流程以及系统如何处理冲突来学习很多东西。