EXCEPT 命令的问题!!!

发布于 2022-08-26 05:34:01 字数 246 浏览 10 评论 9

在资料中有这样一段话“•如果对不包含字段的格式规定做例外输出,则发生以下情况:
        -如果说明了输出文件,用缺省值写记录。
        -如果记录加锁,系统则认为该操作是请求打开记录锁。这是请求解锁的替换格式。另一种方法是用UNLOCK操作。”
我想写个例子实现解锁的这种情况,但是怎么考虑也没能想出办法来,有对这个熟悉的吗,能不能给举个例子!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

萌辣 2022-08-28 05:26:52

有过啊,我的程序遇到别人超过1分钟的锁,程序就出问题了。
这问题的根子出在别人的程序里。就是别人的程序“忘记”解锁了。
我给的是最典型的例子。这就是:
读文件加锁准备更新纪录。
  可是更新是有条件的
    条件满足则更新,更新就自动解锁了
  条件不满足,许多程序员就让它去了,其中的原因有的是不懂其中的奥妙,或者偷懒,责任心不强,只顾自己的程序运行没有问题就可以了,不为其他作业着想。。。正规的作法是应该解锁。除非读文件是在一个循环里,循环会读下一个记录,这样当前记录就自动解锁了。
不过在循环出口,还得解锁,不然如果最后一个记录不需要更新的话,它又可能被长期锁住了。

这些由于加锁和解锁造成的问题在单用户的测试中是很难发现的。但是这种低劣程序的危害是很大的,而且比较难找到根源出在那里。

如果需要讨论,我们可以在 MSN 里面进行。 我的代码是  liuyongshen@hotmail.com.

[ 本帖最后由 franliu 于 2009-11-23 10:57 编辑 ]

黯淡〆 2022-08-28 05:26:17

CHAIN的时候会被锁,CHAIN后不就解锁了吗

无尽的现实 2022-08-28 05:23:05

你的编程经历中有遇到对一个chain操作,会遇到记录锁吗?按你的话说,unlock是解自己程序造成的锁。

悲歌长辞 2022-08-28 05:11:09

你的理解不是很正确的啦。正如你所说的,我是有经验的程序员,不可能犯你所说的低级错误来误导菜鸟们。

其实你说的和我说的是两码事。

你说的是如果一个记录已经被另外有问题的一个作业长期锁住,再运行我的程序会遭遇的情况。

我说的是我的程序怎样开锁以免对其他作业造成的不良影响(你说的那种情况就是由于有些程序写得不好造成的,我就是要避免造成这种问题)。我这个例子是很经典的例子。不可能有错的。

chain找到纪录,就自动上锁了。

CHAIN之后检查%FOUND(ILE RPG) 或者 *IN90 = *OFF(旧的 RPG) 是很常规的做法来看CHAIN成功地读到纪录,不知道你怎么还会提出些没有边际的问题。

程序然后程序检查条件,譬如工龄超过10年就给津贴。然后就更新员工纪录。更新之后操作系统就自动解锁了。
如果工龄不到10年,不需要更新纪录,那就应该用except或者unlock来开锁,不然这个纪录就一直被锁上,只直到程序结束运行,或遇到另一个CHAIN到同一个文件的其他纪录。

如果忘记开锁,而这个程序后来又运行超过1分钟,其他想更新这个纪录的作业就会有问题了。

介绍一些诀窍给你。希望对你有用。
检查一个文件中那些纪录被锁住。  dsprcdlck  
你可以debug这个程序,设置断点,单步执行,每走一步,用另外一个5250对话运行dsprcdlck,就回对这个问题有更透彻的了解了

我还要告诉你的是,UNLOCK只能解开我自己的作业上的锁。不可能解开其他作业的锁。 要解开其他作业的锁,唯一办法就是杀死那个作业。

可能是我孤陋寡闻,如果你知道如何不杀死那个作业(包括end request) 又可以解锁,那就请多多指教啦!(可能新版os400有了一条unlock的新命令可以解除任何作业对纪录加上的锁?)

[ 本帖最后由 franliu 于 2009-11-23 08:06 编辑 ]

风和你 2022-08-28 00:31:58

北京★passthru(448081936) 23:02:09
注意:上面的例子,chain是带锁的,如果这时记录已经处在locked,就没有%found,更谈不上update,或write(except)。从另外一个角度讲,造成记录locked,主要有两种原因:1)记录处在事物中;2)记录locked是程序死循环造成的。如果知道是第二种情况,就可以用unlock。如果是第一种情况,就不能unlock。第二种情况,也不能用chain来判断。应用*pass和job占用cup同时进行判断,才能用程序unlock,这个unlock应该放在错误例程中来使用。

调妓 2022-08-27 23:49:09

到我们400交流群来吧,我把这个贴子放在群内讨论,指出不妥之处,17991759.pls

枫以 2022-08-27 20:14:05

有何不妥,请指教。

闻呓 2022-08-27 18:51:57

原帖由 franliu 于 2009-11-22 20:49 发表
给你一个例子。
读表  MY_FILE
如果找到纪录,又满足某条件,则更新某些字段。
如果某条件不满足,则解锁该纪录,以免其他作业无法更新此纪录。

C    NY_KEY          CHAIN MY_FILE
C                  ...

这样对吗?你应该是个有经验的程序员,怎么这样回答问题呢?

眼角的笑意。 2022-08-27 03:36:25

给你一个例子。
读表  MY_FILE
如果找到纪录,又满足某条件,则更新某些字段。
如果某条件不满足,则解锁该纪录,以免其他作业无法更新此纪录。

C    NY_KEY          CHAIN MY_FILE
C                          IF      %FOUND
C                          IF      YOUR CONDITON
C               .......   (POPULATE FIELDS IN MY_FILE
C                          UPDATE MY_RECORD
C                          ELSE
C                          UNLOCK  MY_FILE
C                          ENDIF
C                          ENDIF

[ 本帖最后由 franliu 于 2009-12-1 12:21 编辑 ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文