使用 IBM SQL 导航锁定文件创建的 AS400 DB2 视图正在使用

Posted

技术标签:

【中文标题】使用 IBM SQL 导航锁定文件创建的 AS400 DB2 视图正在使用【英文标题】:AS400 DB2 View Created with IBM SQL Nav Locking File In Use 【发布时间】:2016-04-06 13:40:43 【问题描述】:

我已经搜索了几天试图找到解决方案,但找不到任何解决方案,因此我决定与社区联系。我是一名 Windows 程序员,我不熟悉 AS400 中的 DBA 编程和命令。

我创建了几个视图,它们只是简单地选择生产表的语句。它们是使用 IBM SQL navigator 创建的,我喜欢将其用于大多数事情,因为我对 AS400 不够熟悉,无法直接从数据库绿屏执行此操作。我收到一位导演的投诉,说我创建的观点给他带来了一些问题。他说我的观点是锁定表格,AS400 不允许他在文件使用时重新组织文件。

他说如果他是 DBA,他不会允许我做我所做的事情。多年来我已经创建了数千个视图,但使用 SQL Server 而不是 AS400,我感到不知所措。不允许我创建 SQL 视图在我看来就像在处理数据库中的此问题方面经验不足的人。

我通过在 sql navigator 中创建视图来寻求一些基本帮助,以防止锁定表以进行重组等。我使用 iSeries SQL Navigator 创建了视图,并在创建后简单地调整了视图的权限。我做错了什么吗?我需要做些什么来防止锁定?

更新:有一个 ASP.NET 应用程序可以查询视图以放入 Excel 报告并通过电子邮件发送出去。作业完成后,该应用程序会关闭连接。

【问题讨论】:

如果主管是DBA,他可能不需要重新组织表格;然后可能会定义这些表,以便它可能是不必要的。 RGZPFM 命令需要独占 使用,除非将 ALWCANCEL(*YES) 和 LOCK(*EXCLRD) 或 LOCK(*SHRUPD) 指定为命令参数。但是 ALWCANCEL(*YES) 需要记录表,我猜他们不是因为主管不是 DBA。如果您只是从表格中读取,则不需要 VIEW。你为什么创造它们? 创建视图是因为查询很复杂,导致多个查询的组合。与其对这些查询进行硬编码并通过读取应用程序中多个查询的结果来使程序膨胀,不如说视图是最好的解决方案和最快的解决方案。这些观点运作良好。我将使用提供的命令检查锁,看看是否存在与这些视图的打开连接未按预期关闭的问题。 足够好的理由。当然,无论哪种方式,锁都是一样的。所以你的主管的抱怨是查询是在需要独占访问的时候运行的。是否使用 VIEW 无关紧要。如果您拥有创建 VIEW 的数据库权限,则应该没有投诉的依据,因为它们没有(锁定)区别。 我想我现在搞砸了。我向他提出了我的计划,他告诉我 corp 有一个源代码控制产品,这些产品不会迁移到它,它也会错误重建功能。他说我没有理由以这种方式创建文件。他现在要强迫我在 AS400 上重新创建几十个视图。有些是复杂的sql语句。 源代码控制是一个单独的问题。如果“corp”要求使用它,则将您的视图复制/粘贴到源代码管理应用程序中并进行推广——假设您有权执行该操作。如果您不这样做,则需要由这样做的人完成,或者您需要在外部程序中进行查询。 【参考方案1】:

创建视图不会创建锁。

但是,直接或通过视图读取表的方式与在 MS SQL Server 中的操作相同。

您没有提及您是如何从程序或某些 SQL 工具(例如 SQuirreL 或 IBM 的 Run SQL Scripts)读取视图的。如果来自程序,则需要确保正确关闭结果集/连接我已经看到很多错误的代码无法正确关闭结果集/连接;如果还使用了连接池,这将是一个真正的问题。

假设结果集和连接被正确关闭,另一个问题是所谓的伪关闭游标。出于性能原因,默认情况下,一旦系统对给定游标(打开数据路径 (ODP))进行了 3 次完全打开,系统将在要求时停止完全关闭它。

这会导致需要对表进行独占访问的操作出现问题。

实际上,只有当操作不愿意等待系统自动完全关闭ODP时才会出现问题。根据操作,等待的意愿由表上的最大文件等待时间 (WAITFILE) 参数和/或作业的默认等待时间 (DFTWAIT) 时间控制。

您也可以使用 Allocate Object 命令手动请求系统完全关闭表上的任何伪关闭 ODP,如下所示:

ALCOBJ OBJ((MYLIB/MYTABLE *FILE *EXCL)) CONFLICT(*RQSRLS)

有关伪关闭游标的更多信息,请参阅此 IBM 文档 Pseudo Closed Cursor FAQ

几个选项

    确保操作愿意等待。 CHGPF 文件(MYLIBIB/MYTABLE)WAITFILE(1) CHGJOB DFTWAIT(30) 使用上面的 ALCOBJ 手动强制关闭伪关闭游标

最后,考虑停止使用 1980 年代下午 5 点回家时的命令。

不再需要使用 RGZPFM,而是更改表以重用已删除的记录。

CHGPF FILE(MYLIB/MYTABLE) REUSEDLT(*YES)

使用 SQL DELETE 语句代替 CLRPFM。

【讨论】:

我想知道是否可以执行将视图用作只读的查询。会不会解开锁?我不能用 AS400 的信息去找我的主管,因为我不能告诉你这会被视为我在破坏他。我想使用 ASP.NET 方法来避免记录锁定问题。 1. IIRC 物理文件重组需要独占文件访问,这意味着即使是打开的只读访问也会阻止它。 2.检查你的director是指RGZPFM命令还是物理文件的删除/重命名。创建的视图会阻止这些操作,无论作业是否正在使用它。 不,仅现成无济于事。锁定是系统用于读取记录的 ODP 的结果,该记录保持打开状态以供将来读取。 @Mike,您可以使用 WRKOBJLCK 命令查看锁。如果有一些,并且您运行我的答案中显示的 ALCOBJ 命令并且它们没有消失,那么您的 ASP 应用程序没有关闭结果集。 我会检查这些锁。我猜想使用 SQL Server,DBA 从来没有任何理由像我的主管那样继续重组表。在我开始为这家公司使用 DB2 AS400 数据库之前,我从来没有遇到过这个问题。我会开始看这些锁,看看我能不能检测到来源

以上是关于使用 IBM SQL 导航锁定文件创建的 AS400 DB2 视图正在使用的主要内容,如果未能解决你的问题,请参考以下文章

十进制字段在 IBM AS400 的窗口上显示为负数

IBM的内容导航器插件JAR文件未找到

我可以使用 sql 在 AS400 中创建“逻辑文件”吗?

使用C#调用AS400程序并从QTEMP中选择文件

SQL交叉表

iOS 导航栏项目图片大小