免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 31539 | 回复: 41
打印 上一主题 下一主题

EXCEPT 命令的问题!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-17 10:02 |只看该作者 |倒序浏览
在资料中有这样一段话“•如果对不包含字段的格式规定做例外输出,则发生以下情况:
        -如果说明了输出文件,用缺省值写记录。
        -如果记录加锁,系统则认为该操作是请求打开记录锁。这是请求解锁的替换格式。另一种方法是用UNLOCK操作。”
我想写个例子实现解锁的这种情况,但是怎么考虑也没能想出办法来,有对这个熟悉的吗,能不能给举个例子!!!

论坛徽章:
0
2 [报告]
发表于 2009-11-22 20:49 |只看该作者

回复 #1 chen405 的帖子

给你一个例子。
读表  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 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-11-22 22:41 |只看该作者
原帖由 franliu 于 2009-11-22 20:49 发表
给你一个例子。
读表  MY_FILE
如果找到纪录,又满足某条件,则更新某些字段。
如果某条件不满足,则解锁该纪录,以免其他作业无法更新此纪录。

C    NY_KEY          CHAIN MY_FILE
C                  ...

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

论坛徽章:
0
4 [报告]
发表于 2009-11-22 23:18 |只看该作者

回复 #1 chen405 的帖子

有何不妥,请指教。

论坛徽章:
0
5 [报告]
发表于 2009-11-22 23:44 |只看该作者
到我们400交流群来吧,我把这个贴子放在群内讨论,指出不妥之处,17991759.pls

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

论坛徽章:
0
7 [报告]
发表于 2009-11-23 00:17 |只看该作者

回复 #6 passthru 的帖子

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

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

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

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

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 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-11-23 09:53 |只看该作者
你的编程经历中有遇到对一个chain操作,会遇到记录锁吗?按你的话说,unlock是解自己程序造成的锁。

论坛徽章:
0
9 [报告]
发表于 2009-11-23 09:59 |只看该作者
CHAIN的时候会被锁,CHAIN后不就解锁了吗

论坛徽章:
0
10 [报告]
发表于 2009-11-23 10:08 |只看该作者

回复 #8 passthru 的帖子

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

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

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

[ 本帖最后由 franliu 于 2009-11-23 10:57 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP