请教一下PB+ sybase存储过程中事务控制的问题。
binli 2008-11-21 12:48:24
开发环境:pb8+sybase12.5
我做了一个存储过程sp_test,里边使用如下的方式控制事务:
begin trans mytrans
update table_a
set col1 = 123
where id = @al_id
if @@rowcount = 1 and @@error = 0 and @@sqlstatus = 0
begin
@al_return = 1
commit trans mytrans
end
else
begin
@al_return = -1
rollback trans mytrans
end
end if
其中:@al_return 为存储过程返回的操作结果。
使用isql来做调试时,结果是正确的,包括对table_a的修改和事务的提交都是ok的。
到了pb里边,就发现问题了,对table_a的修改没有提交,table_a处于锁定状态。
pb端的调用代码如下:
DECLARE sp_t procedure for sp_test
@var_key = :ls_id,
@var_return = :ll_return output
using sqlca;
execute sp_t;
if sqlca.sqlcode = 0 then
fetch sp_t into :ll_return;
if ll_Return = 1 then
commit using sqlca;
else
rollback using sqlca;
end if
else
rollback using sqlca;
end if
通过pb的debug,确认程序已经跑到ll_Return = 1 ,而且也执行 commit using sqlca;了。
问题是
1)为什么这个表还处于锁定状态 ?
而且关闭程序后,table_a的值并没有更改,因为我们设定sqlca.autocommit = false 的,
应该是关闭数据库连接时,执行了rollback了。
2)如果存储过程sp_test执行成功后,在pb8这边做rollback,能否回滚sp_test对table_A做的修改?
3)后续还做了如下测试,在sp中去掉 begin trans mytrans , rollback trans mytrans ,commit trans mytrans等操作,
使用 rollback 代替 rollback trans mytrans.这样的话,可以在pb控制rollback,但是还是无法commit。
麻烦各位帮看看是什么问题,先谢谢各位了!