请问如何解决这类锁表?~~~~~~
请问如何解决这类锁表?
一个SQLRPGLE程序,
先用SQL语句从别的表中insert一些记录到一个表mytable1中,
SQL语句后面运行一段RPGLE语句,对表mytable1中的记录进行修改,
这时候发现报错表被锁,是执行的SQL语句把这个表锁住了吗?
如何解锁可以继续用RPGLE语句修改这个表的记录呢?
尝试了把这段RPGLE语句另生成一个独立的PGM,用一个总程序调用这两个程序,
第二个RPGLE语句程序仍然被锁报错。
以前用SQLRPGLE不多。
另外另一个问题,SQL语句执行的结果如何设置指示器之类捕捉呢?
如果出错了,就整个程序跳出报错,有捕捉办法嘛?
这里先行谢过!~~~~~~~~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
是吗?我就用一般的14,或15编译,还真没注意这个参数,谢谢
SQLRPG程序会有提交控制的,如果不指明你的SQL语句提交控制级别,就默认是你当前作业的提交控制级别,比如你调用SQLRPG之前,启动了STRCMTCTL *CS,那么SQL的提交控制级别就是CS,那在你SQL提交数据之前你的记录都被你自己锁着。
解决的办法是在SQL语句的后面加上WITH NC,这样的话你的SQL语句就关闭了提交控制——其他RPG程序还是在事务中的。如果其他程序错误导致要回滚数据的话,你的SQL提交的代码就回滚不了了。感觉这样的程序会不那么优雅,整个作业一部分在事务中,一部分不在事务中......所以还是建议你根据业务逻辑调整一下你的代码。
[ 本帖最后由 newbiezhang 于 2009-12-17 16:29 编辑 ]
你的sqlrpgle程序是怎么编译的???如果编译sqlrpgle时将参数commit(*chg)改为commit(*none)就不会被sql加锁。。。!
这个方法我试验过,不行
谢谢各位!初步搞定!
把RPGLE语句放到了另一个程序,
第一个SQLRPGLE程序的SQL语句部分改写如下,
之前增加了CALL QCMDEXC系统调用STRCMTCTL
SQL语句之后COMMIT,
然后系统调用ENDCMTCTL,
然后系统调用QSYS/RCLRSC LVL(*CALLER)
完毕,
主程序先调用SQLRPGLE程序,再调用RPGLE程序,
这把没锁表。
至于写到同一个程序里,没试验出来,没时间试验了。
这个办法是我查找软件系统的其他SQLRPGLE代码里,找到这段似乎是释放资源的,
就试验了一下,结果可以,
谢谢诸位!
SQLCOD是多少?
是不是可以把文件定义KEYWOER--USROPN,执行完SQL 关了 --> 再开--->RPGLE
我没试过。。
mytable1就是正常PF文件编译出来的表
mytable1是临时表吗?
SQL语句执行的结果可以用SQLCOD捕捉,不同的值表示不同的结果,出错可以GO 'ABEND'