免费注册 查看新帖 |

Chinaunix

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

简单的程序,奇怪的LF锁,请各位帮忙一下,拜托了! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-04 23:43 |只看该作者 |倒序浏览
CL1的代码:
......
OVRDBF (FILE1) (LIB1/FILE1) SHARE(*YES)
OVRDBF (FILE2) (LIB1/FILE2) SHARE(*YES)
CALL (RPG1)
DLTOVR FILE1
DLTOVR FILE2
RGZPFM FILE1
RGZPFM FILE2
......

RPG1的代码:
......
FFILE2     IF     K   DISK  *INfSR(*PSSR)
......
C/EXEC SQL
C+ DELETE FROM FILE1 WHERE FIELD1 = VALUE1
C/END-EXEC
......
C            1               DO          10              I
C        ARR(I)           IFNE        *BLANK
C                             MOVE      ARR(I)      VAR1
C/EXEC SQL     
C+ DELETE FROM FILE2 WHERE FIELD2 = :VAR1
C/END-EXEC
C                             ELSE
C                             LEAVE
C                             ENDIF
C                             ENDDO  

代码没有写全,就写上个意思。我就简单说一下,CL的作用就是over ride那两个PF,然后call那个SQLRPG,然后再对两个PF进行RGZPFM。而SQLRPG里面分别对这两个文件进行数据的删除,对于文件FILE1来说,只删除一次,就是那个FIELD1符合VALUE1的这个情况;而对FILE2,要删除的就是符合FIELD2的值等于数组ARR(I)里面的各个非空白的值,如果到ARR(I)有元素空白了,那就结束这个DO的循环了。其实这样编译后运行是没有错误的,问题是我的FILE1和FILE2之间有一个共同的LF,就是FILE_LF。这个FILE_LF里面有两个record format,两个PFILE分别就是FILE1和FILE2了。就是把FILE1和FILE2的record format一起写到了FILE_LF这个LF中。其实FILE1和FILE2有一个共同的LF还不能导致我接下来的这个问题,导致我出现问题的是FILE2的删除要执行两次的情况,就是ARR(I)里面有两个非空的值,这样我的DO就要执行两次。经过我的DEBUG发现,因为我在F定义区那里定义了FILE2,所以在我程序执行时,是锁住FILE2的,没有锁住FILE1,但是我的DO如果要执行两次,就是要执行两次DELETE的SQL语句,第一次执行完了,程序锁住的还是FILE2,但是当第二次执行完,程序锁住的除了FILE2外,还有FILE_LF这个LF也被锁了!而且直至这个SQLRPG结束了,回到了CL,要执行RGZPFM的时候,FILE2和FILE_LF还是被锁着,结果就出错了,但是出错的信息竟然是说FILE1的“Access path has already in use...”之类的话。这个就是我遇到的问题,我来归结一下出现的条件:
1)一定要是BATCH JOB才出现这个问题,会出现MSGW告诉你FILE1在in use,直接CALL是不会出现问题的。
2)DO里面的SQL语句要执行两次以上。
3)SQLRPG对两个文件进行操作时,这两个文件有一个LF是以他们各自record format为内容生成的。我这个LF的情况是FILE1的是第一个format,FILE2的是第二个format。

解决方案:现在我能做的解决方案就是把DO里面的要执行的都单独写出来了,就是如果说ARR(I)有10个元素,那样我就写10条SQL语句,分别对ARR(1),ARR(2)...ARR(10)进行判断。

各位知道其中的原因吗?为什么这个LF会在第二次DO就突然出现,而且SQLRPG结束了还显示被锁着,当然显示锁着的程序是CL1那个程序,可是这个LF在整个CL到SQLRPG中都没有调用到,我试过把这个LF删除了,结果确实可以在SQLRPG中DO两次以上,回到CL中也不会MSGW,但是这个LF这么写是有其它程序需要用到的,所以删除LF的方法不行。各位就帮帮忙分析一下吧~!

论坛徽章:
0
2 [报告]
发表于 2008-11-05 00:03 |只看该作者
我试过在target release中分别是V5R2M0,V5R3M0,V5R4M0,情况都是如此~!

论坛徽章:
0
3 [报告]
发表于 2008-11-05 00:06 |只看该作者
是LF在SQLRPG中的BUG吗?

论坛徽章:
0
4 [报告]
发表于 2008-11-05 09:27 |只看该作者
1)一定要是BATCH JOB才出现这个问题,会出现MSGW告诉你FILE1在in use,直接CALL是不会出现问题的。

如果你用 SBMJOB (RPG1)

那么RPG1 还没有完成就执行下面的DLTOVR, 会报错.

因为SBMJOB 是把程序丢到后台去,只要程序丢出去了就会执行后面的语句.

论坛徽章:
0
5 [报告]
发表于 2008-11-06 09:51 |只看该作者
我分析是这样的:
(1)你的LF如果在第二次循环才出现锁,在第一次循环没有出现,那么你将一个Do循环该成
   10次执行也是一样的,LF之所以能够出现是因为:第二次或更多次执行时SQL会可能性选择
最优的索引来执行SQL语句,所以你的LF文件的Key里面可能包含你where条件中指定的field.

(2 ) 当call(rpg1)后出现锁是因为:你的SQLRPGLE程序在编译的时候是否指定了  close curser  *endsql,还有就是编译的SQLRPGLE
commit control 指定为:*NONE
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP