Chinaunix

标题: informix游标问题 [打印本页]

作者: 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到记录。


作者: panda2fw2    时间: 2009-07-07 10:17
我查了nformix文档,按照文档的说法,游标是简单查询时,打开游标所创建的活动集一般只保留下次要访问的行,其他行并不保留。这样的话,不管是否有for update关键字,都应该是无法fetch到已经修改的行了,所以我认为不应该是加锁的问题。
作者: ivhb    时间: 2009-07-07 20:40
原帖由 panda2fw2 于 2009-7-6 16:13 发表
最近碰到个关于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/ ... source/4gl/pp31.htm
作者: ivhb    时间: 2009-07-08 19:56
原帖由 panda2fw2 于 2009-7-8 09:11 发表
to:ivhb  
看来你完全没有明白我的意思,你说的不是我想问的。


呵呵,不想和你争论,informix下,如果你想用for update的游标,就必须这么做。否则,informix的行为就是异常的。
你最好试试看我的说法:)
作者: panda2fw2    时间: 2009-07-10 11:22
原帖由 ivhb 于 2009-7-8 19:56 发表


呵呵,不想和你争论,informix下,如果你想用for update的游标,就必须这么做。否则,informix的行为就是异常的。
你最好试试看我的说法:)


不好意思,我本来就是这么做的,所以我说你没有明白我的意思。
作者: cdcd007    时间: 2009-07-14 14:03
锁级别,隔离级




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2