请教一下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。

麻烦各位帮看看是什么问题,先谢谢各位了!

...全文
158 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
binli 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jdsnhan 的回复:]
或者后台只负责rollback,不要commit;
[/Quote]
我也是希望做到这个效果,实际pb端的commit就是没有效果。
jdsnhan 2008-11-21
  • 打赏
  • 举报
回复
如果在程序中调用,那事物的递交或回滚最好也交给程序,而不是后台,或者后台只负责rollback,不要commit;
锁的问题比较奇怪,估计是哪个小地方出了问题。
lao_bulls 2008-11-21
  • 打赏
  • 举报
回复
binli 2008-11-21
  • 打赏
  • 举报
回复
没有了,pb端就跑了这个存储过程的调用。没有其他的代码了。

如果是别的操作锁了table_a,这样的话,我在sp里边做commit应该也跑不过去的。
liubocy 2008-11-21
  • 打赏
  • 举报
回复
是否有别的什么操作锁定table_a表
binli 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liubocy 的回复:]
在sp中去掉 begin trans mytrans , rollback trans mytrans ,commit trans mytrans等操作

加个按钮,里面只写调用存储过程的代码测试下。
[/Quote]

这个试了,pb端可以rollback,没法commit,这个就是我现在的主要问题了。
liubocy 2008-11-21
  • 打赏
  • 举报
回复
在sp中去掉 begin trans mytrans , rollback trans mytrans ,commit trans mytrans等操作

加个按钮,里面只写调用存储过程的代码测试下。
binli 2008-11-21
  • 打赏
  • 举报
回复
sqlca.autocommit = true的效果如何?

程序需要根据存储过程的结果来控制是提交还是回滚,不能设置autocommit=true的。

现在的情况是这样,如果在sp中,最后执行commit,是可以提交的,但是没法再pb程序中做rollback了。因为pb端还有一部分程序。
如果sp中不做commit,到了pb端,再怎么做commit,也无法提交数据到table_a,table_a处于锁定状态。


if @@rowcount = 1 and @@error = 0 and @@sqlstatus = 0

这个后来改成只要@@error = 0了。
liubocy 2008-11-21
  • 打赏
  • 举报
回复
sqlca.autocommit = true的效果如何?

为什么要用到@@sqlstatus,看你sql里没有用到游标

如果update返回多条,成功的语句也回rollback的

752

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧