免费注册 查看新帖 |

Chinaunix

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

求教:一个RPGLE 事务处理的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-02 03:55 |只看该作者 |倒序浏览
本人为初级入门者,最近用rpgle写了有事务处理的程序。发现了一个重要问题

[本地环境]:OS/400 V5R2M0

[问题描述] :
交待一下,我处理事务的做法大致如下
1. CRTJRNRCV,CRTJRN......

2. STRJRNPF

3. STRCMTCTL

4. CALL XXXXX (RPGLE)

5.ENDCMTCTL


其中1和2不用写进程序 ,3,4,5写在一个CLP里,4是调用一个rpgle程序,里面有相应的commit,rollback处理 。

现在我发现的问题是:


在我更新或新增完一笔记录,但没有任何COMMIT和ROLLBACK的操作时,该笔记录在数据库里是可见的。即使不同的用户新建SESSION也能读取到这笔记录。可以通过strsql中看到,也可以通过RPG读取到,这样的话,极其可能导致数据错误。

一个例子,如果程序a在处理数据,程序b正在统计数据。


可能程序b取得的数据,在一段时间后被程序a的异常处理给rollback掉了。

(在ORACLE里面,系统默认是写进BUFFER里,在提交事务前,别的用户无法看到数据变化。直到执行了COMMIT别的用户才能看到数据的变化)

我想400应该有解决这种问题的方法吧,请老师指点迷津!

论坛徽章:
0
2 [报告]
发表于 2005-01-04 13:50 |只看该作者

求教:一个RPGLE 事务处理的问题

哪位好心人给回复一下吧,谢谢!

论坛徽章:
0
3 [报告]
发表于 2005-01-04 14:20 |只看该作者

求教:一个RPGLE 事务处理的问题

俺不太懂,抛砖引玉一下

在我更新或新增完一笔记录,但没有任何COMMIT和ROLLBACK的操作时,该笔记录在数据库里是可见的。即使不同的用户新建SESSION也能读取到这笔记录。可以通过strsql中看到,也可以通过RPG读取到,这样的话,极其可能导致数据错误。

400有记录锁的,应该不会出现这种问题。

论坛徽章:
0
4 [报告]
发表于 2005-01-04 21:17 |只看该作者

求教:一个RPGLE 事务处理的问题

标题不宜写请教谁,既然是BBS嘛,需要的是大家的群策群力,不是个人能够独撑一面的,所以我把标题改了,不介意吧!:)

关于事务处理,企业里用得不多,所以我也没有这方面的经验,银行的朋友用得会更多些。

关注中。。。

希望有相关经验的朋友出来指点。

论坛徽章:
0
5 [报告]
发表于 2005-01-18 15:05 |只看该作者

求教:一个RPGLE 事务处理的问题

我也还不是很清楚。但。我们曾经用过这样,测试是没有问题的啊。

你在RPG中有UPDATE 或Write的Table 的F卡声明时,是否有加Commit?只能是建议看看。SORRY!

论坛徽章:
0
6 [报告]
发表于 2005-01-19 09:27 |只看该作者

求教:一个RPGLE 事务处理的问题

所以说统计程序要加在事务处理程序的后面啊,等我测试一下先

论坛徽章:
0
7 [报告]
发表于 2005-01-19 09:27 |只看该作者

求教:一个RPGLE 事务处理的问题

楼主说的不会出现,你的A程序在进行操作的时候400,会把表锁起来,像CHAIN,UPDATE等,这个时候是不会让其他程序对表进行修改的。如果你A程序出错,ROLBAK,也是对A程序进行操作的恢复。只有当A程序运行完了把表释放了以后,你的B程序才能进行统计。
还有提一下,如果大家在写的时候,如果用了2次CHAIN 会锁表,我一直没有搞清楚什么原因。谁知道!就是CHAIN-CHAIN 就锁还有。CHAIN-UPDATE-CHAIN 如果是同一条记录也锁!郁闷死了

论坛徽章:
0
8 [报告]
发表于 2005-01-19 11:00 |只看该作者

求教:一个RPGLE 事务处理的问题

关于锁表的实际测试:

1        程序调用:如果A程序调用B程序,而且A、B程序都用U的方式打开同一个文件,更改同一条记录时,那么在调用B程序之前,需要有一个UPDATE或者CLOSE的动作,否则在被调用的B程序将会锁表。

2        程序之间:A程序定义了COMMIT,在UPDATE赋值语句后,UPDATE操作之前,其它程序查找该条记录,仍然是原始的数据;在UPDATE操作之前,事件处理语句之后,其它程序查找该条记录,则是更改后的数据了,如果之后再ROLLBACK操作,的确有可能出现错误,所以说统计程序要在事务处理语句之后进行。

3        程序内部:单个程序内,无论有无定义COMMIT,只要做了UPDATE的操作,都可以多次对同一条记录进行CHAIN的;只要没做UPDATE操作,下一次做CHAIN时,就会锁表。楼上说的情况,没有在测试中出现(即chain -update -chain仍然锁表)。如仍有问题,可先查询一下系统配置,或者是再看看源码

论坛徽章:
0
9 [报告]
发表于 2005-01-19 11:04 |只看该作者

求教:一个RPGLE 事务处理的问题

补充:如果程序是用I(即只读)的方式打开文件,是不会锁表;同时,即使某条记录被其它锁,该程序仍然能够读到这条记录,至于读到的数据,参见上面第2条。

还有,第2条写错了,应该是“在UPDATE操作之后,事务处理语句之前”。

论坛徽章:
0
10 [报告]
发表于 2005-01-19 12:52 |只看该作者

求教:一个RPGLE 事务处理的问题

要看看你的程序是怎么写的?在程序的F表定义中,如果你打开的文件没有加上关键字COMMIT的话,此文件是不会进入事物处理的控制中的,马上修改马上更新。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP