免费注册 查看新帖 |

Chinaunix

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

informix游标问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-06 16:13 |只看该作者 |倒序浏览
最近碰到个关于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到记录,直接跳到下一条记录。

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2017-04-05 11:23:15
2 [报告]
发表于 2009-07-06 17:36 |只看该作者
我是这样认为的:
使用for update时会对当前记录加锁,而加锁这个动作会重读DB,所以就不会FETCH到记录。

论坛徽章:
0
3 [报告]
发表于 2009-07-07 10:17 |只看该作者
我查了nformix文档,按照文档的说法,游标是简单查询时,打开游标所创建的活动集一般只保留下次要访问的行,其他行并不保留。这样的话,不管是否有for update关键字,都应该是无法fetch到已经修改的行了,所以我认为不应该是加锁的问题。

论坛徽章:
0
4 [报告]
发表于 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;

论坛徽章:
0
5 [报告]
发表于 2009-07-08 07:30 |只看该作者
关键是要让fetch和update在一个事务中。可以查阅Informix手册的

论坛徽章:
0
6 [报告]
发表于 2009-07-08 09:11 |只看该作者
to:ivhb  
看来你完全没有明白我的意思,你说的不是我想问的。

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2017-04-05 11:23:15
7 [报告]
发表于 2009-07-08 15:00 |只看该作者
查了查4GL的文档,上面说一般的游标都会把结果放入临时表,而加了FOR UPDATE的游标不需要临时表。
也就是说加了FOR UPDATE的游标每次都重新读取DB上的数据。

论坛徽章:
0
8 [报告]
发表于 2009-07-08 15:09 |只看该作者
能不能告诉我下,是那个文档呢?

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2017-04-05 11:23:15
9 [报告]
发表于 2009-07-08 15:24 |只看该作者

论坛徽章:
0
10 [报告]
发表于 2009-07-08 19:56 |只看该作者
原帖由 panda2fw2 于 2009-7-8 09:11 发表
to:ivhb  
看来你完全没有明白我的意思,你说的不是我想问的。


呵呵,不想和你争论,informix下,如果你想用for update的游标,就必须这么做。否则,informix的行为就是异常的。
你最好试试看我的说法:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP