我遇到了一个问题,我在后端更新了AS / 400中的表 - db2,但更改没有通过前端反映出来。
我们有一个名为“SH.PROM”的表格,用于指定我们每月促销的日期范围。我用适当的包装更新了“SH.PROM”。分区小数和EBCDIC字符。但是,当其他人尝试输入折扣商品的#s时,折扣不会显示在前端。
是否有一个命令来调用系统范围的更新,以便更改立即生效?
答案 0 :(得分:3)
假设您正在使用RPG程序更新表格。 让我们进一步假设RPG程序将SH.PROM声明为没有键的更新主文件。 在这种情况下,RPG(为了提高效率)将缓冲数据库操作,将更新的行存储在内部缓冲区中,直到程序结束并将缓冲区刷新到磁盘。如果是这种情况,RPG编译器底部会显示一条消息,表明正在使用阻塞。在这种情况下,表可以由一个程序更新,但数据库尚不知道更新的行。
如果您在承诺控制下运行,情况会略有不同,但如果我们假设某行被锁定以进行更新而尚未进行COMMIT,则其他作业将保留该锁定。他们不会看到旧数据,而是根本无法读取未提交的更改,而是最终会获得记录等待超时。
还有另一种情况,您在SH.PROM上构建了一个逻辑文件,即MAINT(* REBLD)。你更新SH.PROM;最终用户通过SH.PROML1读取,并且在他们可以看到记录之前重建索引需要一些时间。
除此之外,实际上没有办法延迟或推迟数据库更新。一般来说,如果您更新一行,它会立即可用。上述方案似乎都没有反映您的报告内容。检查以确保您正在更新用户正在访问的同一个表。您可能正在更新TESTLIB / SH.PROM,并且用户正在阅读PRODLIB / SH.PROM。或者,可能会有一些夜间进程将SH.PROM传播到其他表中,最终用户可以访问这些表。
关于'正确包装&分区小数和EBCDIC字符'令人困惑。你是如何更新SH.PROM的? JDBC? RPG? SQL语句是通过IBM i Navigator运行的吗?为什么注意'正确包装& amp;划分小数'?是因为SH.PROM是一个平面文件(没有定义实际列),你必须通过使用SQL内置函数来模拟压缩十进制字段吗?