我想了解一下REXX语言如何处理数据集锁的问题。
情况如下:
- 我在我的ISPF编辑器中打开了一个顺序数据集
- 我启动了一个REXX程序,用于更新(进行更改)该数据集
- 这个程序能够正常运行,但这是怎么实现的呢?通常,如果您在编辑器中打开数据集,并试图从另一个程序中使用它(例如,如果您提交某个作业),您将收到“数据集正在使用”的消息。
为什么这里的REXX可以正常工作呢?也许是同一地址空间或其他原因?
有人可以告诉我吗?
REXX不管理数据集锁定。REXX调用服务模块来分配数据集并对其执行I/O操作。在TSO下,I/O服务例程称为EXECIO。在EXECIO可以对数据集进行操作之前,必须在TSO下将其分配给某个DDName。然后在EXECIO请求中引用该DDName。
数据集可以直接从TSO命令提示符或您的REXX exec中分配。数据集锁定级别由分配数据集时提供的DISPosition参数确定。
您特定示例中需要注意的重点是,您正在运行一个ISPF编辑会话和REXX exec在同一个TSO会话下。在同一TSO会话中的数据集分配不会相互阻塞。DISP参数指定如何与其他进程进行锁定,而不是进程本身。因此,在同一TSO会话中运行的不同程序之间永远不会出现数据集锁定问题。
ISPF编辑器弹出的“数据集正在使用”消息是编辑器本身检查是否有先前在同一TSO会话下分配的数据集的功能。
尝试以下实验:
重复您所描述的内容:在数据集上打开一个ISPF编辑会话。然后在同一TSO会话下运行您的REXX proc以进行更新。应该可以正常工作。
接下来:请朋友在数据集上打开一个ISPF编辑会话。这次您的REXX proc将因“数据集正在使用”而崩溃。您可以通过在TSO中编辑数据集并将REXX exec作为批处理作业提交到您的帐户下来执行相同的操作。交互式TSO会话是一个进程,批处理TSO会话是第二个进程,并且数据集锁定将在它们之间发生(您的批处理作业将崩溃或挂起,直到TSO Edit会话被放弃)。
只有在不同进程尝试使用不兼容的DISP参数分配相同数据集时,才会出现数据集访问冲突。