EXCEPT 命令的问题!!!
在资料中有这样一段话“•如果对不包含字段的格式规定做例外输出,则发生以下情况:
-如果说明了输出文件,用缺省值写记录。
-如果记录加锁,系统则认为该操作是请求打开记录锁。这是请求解锁的替换格式。另一种方法是用UNLOCK操作。”
我想写个例子实现解锁的这种情况,但是怎么考虑也没能想出办法来,有对这个熟悉的吗,能不能给举个例子!!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
有过啊,我的程序遇到别人超过1分钟的锁,程序就出问题了。
这问题的根子出在别人的程序里。就是别人的程序“忘记”解锁了。
我给的是最典型的例子。这就是:
读文件加锁准备更新纪录。
可是更新是有条件的
条件满足则更新,更新就自动解锁了
条件不满足,许多程序员就让它去了,其中的原因有的是不懂其中的奥妙,或者偷懒,责任心不强,只顾自己的程序运行没有问题就可以了,不为其他作业着想。。。正规的作法是应该解锁。除非读文件是在一个循环里,循环会读下一个记录,这样当前记录就自动解锁了。
不过在循环出口,还得解锁,不然如果最后一个记录不需要更新的话,它又可能被长期锁住了。
这些由于加锁和解锁造成的问题在单用户的测试中是很难发现的。但是这种低劣程序的危害是很大的,而且比较难找到根源出在那里。
如果需要讨论,我们可以在 MSN 里面进行。 我的代码是 liuyongshen@hotmail.com.
[ 本帖最后由 franliu 于 2009-11-23 10:57 编辑 ]
CHAIN的时候会被锁,CHAIN后不就解锁了吗
你的编程经历中有遇到对一个chain操作,会遇到记录锁吗?按你的话说,unlock是解自己程序造成的锁。
你的理解不是很正确的啦。正如你所说的,我是有经验的程序员,不可能犯你所说的低级错误来误导菜鸟们。
其实你说的和我说的是两码事。
你说的是如果一个记录已经被另外有问题的一个作业长期锁住,再运行我的程序会遭遇的情况。
我说的是我的程序怎样开锁以免对其他作业造成的不良影响(你说的那种情况就是由于有些程序写得不好造成的,我就是要避免造成这种问题)。我这个例子是很经典的例子。不可能有错的。
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 编辑 ]
北京★passthru(448081936) 23:02:09
注意:上面的例子,chain是带锁的,如果这时记录已经处在locked,就没有%found,更谈不上update,或write(except)。从另外一个角度讲,造成记录locked,主要有两种原因:1)记录处在事物中;2)记录locked是程序死循环造成的。如果知道是第二种情况,就可以用unlock。如果是第一种情况,就不能unlock。第二种情况,也不能用chain来判断。应用*pass和job占用cup同时进行判断,才能用程序unlock,这个unlock应该放在错误例程中来使用。
到我们400交流群来吧,我把这个贴子放在群内讨论,指出不妥之处,17991759.pls
有何不妥,请指教。
这样对吗?你应该是个有经验的程序员,怎么这样回答问题呢?
给你一个例子。
读表 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 编辑 ]