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到记录,直接跳到下一条记录。 我是这样认为的:
使用for update时会对当前记录加锁,而加锁这个动作会重读DB,所以就不会FETCH到记录。
:mrgreen: 我查了nformix文档,按照文档的说法,游标是简单查询时,打开游标所创建的活动集一般只保留下次要访问的行,其他行并不保留。这样的话,不管是否有for update关键字,都应该是无法fetch到已经修改的行了,所以我认为不应该是加锁的问题。 原帖由 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; 关键是要让fetch和update在一个事务中。可以查阅Informix手册的 to:ivhb
看来你完全没有明白我的意思,你说的不是我想问的。 查了查4GL的文档,上面说一般的游标都会把结果放入临时表,而加了FOR UPDATE的游标不需要临时表。
也就是说加了FOR UPDATE的游标每次都重新读取DB上的数据。 能不能告诉我下,是那个文档呢? http://www.ronghai.com/resource/informix/training/slides/resource/4gl/pp31.htm 原帖由 panda2fw2 于 2009-7-8 09:11 发表 http://bbs2.chinaunix.net/images/common/back.gif
to:ivhb
看来你完全没有明白我的意思,你说的不是我想问的。
呵呵,不想和你争论,informix下,如果你想用for update的游标,就必须这么做。否则,informix的行为就是异常的。
你最好试试看我的说法:)
页:
[1]
2