存储过程中"事务回滚"问题 ( 积分: 50 )

  • 主题发起人 主题发起人 hwj_wj123
  • 开始时间 开始时间
H

hwj_wj123

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一段存储过程proc_tmp,流程:(其中启动了一个事务aaa,在调用完另一个存储过程后按返回值做rollback和commit操作)

我又在查询分析器里写了如下一段代码:
begin transaction www
exec proc_tmp
rollback transaction www

报如下错误:
服务器: 消息 6401,级别 16,状态 1,过程 proc_tmp,行 25
无法回滚 aaa。没有找到任何该名称的事务或保存点。
但我明明在存储过程proc_tmp中启动了aaa事务,晕!!!!!

如果在查询分析器中只写:
exec proc_tmp
就不会报错


这是什么原因我实在搞不明白了,请教各路高手
 
proc_tmp 存储过程里是不是写了 rollback transaction?
 
to wky4305z
是写了 rollback transaction
不过也有begin tran
 
不能在一个事务内再嵌入一个事务!
 
to zhwsui:
谢谢你的回答
不能在一个事务内再嵌入一个事务吗????????

假如我有两个存储过程A,B,每个内都有事务
难道在存储过程A中就不能调用存储过程B吗,应该可以调用吧
 
sqlserver? oracle?
 
事务是可以嵌入另一个事务的
 
楼主你还是把全部代码都贴出来吧!~
 
是你 proc_tmp 的问题
事务是可以嵌入另一个事务的
 
谢谢各位的回答,我用的是sql server

假如我有两个存储过程A,B,每个内都有事务
都根据不同的情况执行Commit tran rollBack tran

存储过程A中调用存储过程B时,B如果符合条件执行 Commit tran,这样是没问题的
但是B如果不符合条件执行rollBack tran,就不对了
 
例如:
CREATE PROCEDURE A
as
begin
declare @result int
begin tran

exec @result=B
if @result>0
goto Failed

Failed:
ROLLBACK tran
return 1
Succeed:
commit tran
return 0

end
GO



CREATE PROCEDURE B
as
begin

begin tran

goto Failed

Failed:
rollback tran
return 1
Succeed:
commit tran
return 0

end
GO



exec a 发出错误
服务器: 消息 266,级别 16,状态 2,过程 B,行 11
EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 1,当前计数 = 0。
服务器: 消息 3902,级别 16,状态 1,过程 A,行 12
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
 
這是認識上的錯誤,事務雖然是成對出現的,但是在一個連線之下只要有一個COMMIT or ROLLBACK提交之後,之前所有的TRANSACTION=0,所以你的rollback transaction www 當然會出錯了.
 
這是認識上的錯誤,事務雖然是成對出現的,但是在一個連線之下只要有一個COMMIT or ROLLBACK提交之後,之前所有的TRANSACTION=0,所以你的rollback transaction www 當然會出錯了.

to wcl-2001;
对于该句:只要有一個COMMIT or ROLLBACK提交之後,之前所有的TRANSACTION=0
来看 在存储过程B中执行COMMIT or ROLLBACK都会出错
为什么存储过程B执行Failed:出错,而执行Succeed:不会出错
 
to wcl-2001;
也就是说我以上贴出的存储过程A,B有误
应该怎么写呢
 
没有问题呀,存储过程是成功执行的,AAA事务已经提交,怎么还能回滚,
 
请问
CREATE PROCEDURE A
as
begin
declare @result int
begin tran

exec @result=B
if @result>0
goto Failed

Failed:
ROLLBACK tran
return 1
Succeed:
commit tran
return 0

end
GO



CREATE PROCEDURE B
as
begin

begin tran

goto Failed

Failed:
rollback tran
return 1
Succeed:
commit tran
return 0

end
GO
怎么改呢
 
to hwj_wj123;
sql server 2000很難捕獲到錯誤,也就是說根本就沒執行到if @result>0這一行,所以顯然就出錯了.這就是为什么存储过程B执行Failed:出错,而执行Succeed:不会出错;
server 2005相對來說就要好一些,當然oracle在事務方面要比sql server 好得多;delphi+sql server 在事務處理上有待改進.
 
執行到了if @result>0這一行

sql server 2005也会出这个错误
 
就这样吧
可能不能解决了
 
后退
顶部