Posted on 2009-12-16 10:47
Prayer 阅读(487)
评论(0) 编辑 收藏 引用 所属分类:
DB2CLI
无论是否使用with hold与否,rollback将释放session中的游标。commit只释放不带with hold的游标。
保持游标打开的方法是在定义游标时加上with hold选项
但是,我declare 游标时使用了with hold选项--只对commit有效。
程序段:
declare test_cur cursor with hold for
select .... from A where ... order by ... with ur;
open test_cur;
while( 1 ){
fecth test_cur into ......;
判断SQLCODE
begin_work(); /* 其实就是设置了一个标志 */
SQL 操作,修改其他表或者游标所在表的数据。
根据结果判断 commit or rollback。 /* 此处如果rollback 游标被关闭 */
}
异常状态:
如果游标中进行了SQL操作,根据结果判断并rollback时,
下一次fetch时,会提示 501 没有打开游标。从而报错退出。
这种方案是否可行
游标改用普通游标。
游标取出当前记录后,fork子进程。
主进程只管从游标取数。
子进程进行事务、处理、判断、修改状态、提交等等。
主进程等子进程的结束信号,然后取下一条记录。
程序段:
declare test_cur cursor with hold for
select .... from A where ... order by ... with ur;
open test_cur;
while( 1 ){
fecth test_cur into ......;
判断SQLCODE
pid = fork();
if( pid == 0 ) { /* 子进程干活 */
sqledtin( &sqlca );
setsid();
signal( SIGHUP, SIG_IGN );
db_disconn( G_mdb_name );
begin_work(); /* 其实就是设置了一个标志 */
SQL 操作,修改其他表或者游标所在表的数据。
根据结果判断 commit or rollback。
db_disconn();
exit();
}
/* 主进程等待子进程结束 */
}
close test_cur;
如果是两个不同的事务的话,你用CLI来写比较方便
在cursor内部设立一个savepoint, rollback时用
rollback to savepoint a;