panda2fw2 发表于 2009-07-06 16:13

informix游标问题

最近碰到个关于informix游标fetch的问题,一直想不通,查了informix很多文档也没找到,希望高手们能指点以下。
问题:a表中有10条zt字段为0的记录,声明游标select * from a where zt='0',fetch记录后update zt='1'。假设游标fetch到第5条记录,这时update第9条记录zt字段为'2',等游标fetch到第9条记录时,某些情况游标会fetch第9条记录,然后update,某些情况游标会跳过第9条记录,直接fetch第10条记录。经过测试(隔离级别为DR、CR、CS),1、声明游标时没有加for update关键字的情况下,游标可以fetch到记录。2、声明游标时加上for update关键字的情况下,游标不会fetch到记录,直接跳到下一条记录。

yunzhongyue 发表于 2009-07-06 17:36

我是这样认为的:
使用for update时会对当前记录加锁,而加锁这个动作会重读DB,所以就不会FETCH到记录。

:mrgreen:

panda2fw2 发表于 2009-07-07 10:17

我查了nformix文档,按照文档的说法,游标是简单查询时,打开游标所创建的活动集一般只保留下次要访问的行,其他行并不保留。这样的话,不管是否有for update关键字,都应该是无法fetch到已经修改的行了,所以我认为不应该是加锁的问题。

ivhb 发表于 2009-07-07 20:40

原帖由 panda2fw2 于 2009-7-6 16:13 发表 http://bbs2.chinaunix.net/images/common/back.gif
最近碰到个关于informix游标fetch的问题,一直想不通,查了informix很多文档也没找到,希望高手们能指点以下。
问题:a表中有10条zt字段为0的记录,声明游标select * from a where zt='0',fetch记录后update...


informix 中,一般是这么用的


exec sql begin work;
exec sql declare a_cur cursor with hold for
   select ....
for update of ...
;
exec sql open a_cur;
for (;;) {
   exec sql fetch a_cur ...;
   if (SQLCODE)
   break;
   exec sql update ... where current of a_cur;
   if (SQLCODE >= 0)
   exec sql commit work;
   else
   exec sql rollback work;
   exec sql begin work;
}
exec sql commit work;
exec sql close cursor;

ivhb 发表于 2009-07-08 07:30

关键是要让fetch和update在一个事务中。可以查阅Informix手册的

panda2fw2 发表于 2009-07-08 09:11

to:ivhb
看来你完全没有明白我的意思,你说的不是我想问的。

yunzhongyue 发表于 2009-07-08 15:00

查了查4GL的文档,上面说一般的游标都会把结果放入临时表,而加了FOR UPDATE的游标不需要临时表。
也就是说加了FOR UPDATE的游标每次都重新读取DB上的数据。

panda2fw2 发表于 2009-07-08 15:09

能不能告诉我下,是那个文档呢?

yunzhongyue 发表于 2009-07-08 15:24

http://www.ronghai.com/resource/informix/training/slides/resource/4gl/pp31.htm

ivhb 发表于 2009-07-08 19:56

原帖由 panda2fw2 于 2009-7-8 09:11 发表 http://bbs2.chinaunix.net/images/common/back.gif
to:ivhb
看来你完全没有明白我的意思,你说的不是我想问的。

呵呵,不想和你争论,informix下,如果你想用for update的游标,就必须这么做。否则,informix的行为就是异常的。
你最好试试看我的说法:)
页: [1] 2
查看完整版本: informix游标问题