共享数据表服务与 VSAM 之间的差异
由于共享数据表服务会替换许多数据表请求的 VSAM ,因此实现某些请求的方式存在差异。
- 更新时读取 (不同事务)
对于由 另一 事务针对某个数据表记录发出的 READ UPDATE 之后并在关联的更新请求之前的数据表记录的 READ 命令,当使用共享数据表服务时,将立即处理 READ 命令。
使用 VSAM 时, READ 命令将等待更新请求完成。
- 更新时读取 (同一事务)
- 对于由 同一 事务针对该记录发出的 READ UPDATE 之后且在关联的更新请求之前的数据表记录的 READ 命令,当使用共享数据表服务时,将立即处理 READ 命令。
使用 VSAM 时,事务会导致死锁异常结束 AFCG。
- 浏览期间删除
当共享数据表服务用于数据表记录的 STARTBR 或 RESETBR 命令时,可以在发出关联的 READNEXT 或 READPREV 命令之前删除该记录。 使用 VSAM 时,在发出关联的 READNEXT 或 READPREV 命令之前,无法删除记录。
因此,当使用共享数据表服务时,如果使用除特殊 "最后记录" 键 X'FF .... " 以外的键发出 STARTBR 或 RESETBR 命令, 并且在 READNEXT 命令之前删除所选择的记录, READNEXT 命令读取后续记录。
如果没有后续记录,那么将返回 ENDFILE 条件。 如果在 STARTBR 或 RESETBR 上使用了 EQUAL 选项,那么读取的记录的键可能与指定的键不匹配。
如果使用特殊的 "last record" 键发出了 STARTBR 或 RESETBR 命令,并且在 READPREV 命令之前删除了选定的记录,那么 READPREV 命令将读取前面的记录,如果没有记录,那么将返回 ENDFILE 条件。
- 浏览期间写入
- 使用共享数据表服务时,如果浏览读取到文件末尾,引发 ENDFILE 条件,然后在文件末尾之外插入新记录,那么后续 READNEXT 能够读取新记录。
使用 VSAM 时,后续 READNEXT 可能无法找到新记录,而是再次报告 ENDFILE 条件。
- 更新时删除 (同一事务)
当共享数据表服务用于一个 DELETE 命令,该命令在同一事务对该记录发出 READ UPDATE 之后并在关联的更新请求之前为该记录指定 RIDFLD 时,会成功处理 DELETE 命令,并且关联的更新请求接收到 NOTFND 条件。