当前位置: 代码迷 >> Sql Server >> 存储过程 ROLLBACK TRANSACTION 报错
  详细解决方案

存储过程 ROLLBACK TRANSACTION 报错

热度:314   发布时间:2016-04-24 10:03:34.0
存储过程 ROLLBACK TRANSACTION 出错
IF EXISTS(SELECT * FROM sys.objects WHERE type='p' AND name='test1abc')
   DROP PROC test1abc 
GO

create proc [dbo].[test1abc] (@pat_in_no char(20))
as  
declare @pat_id char(26),@ret int

if  not exists(select * from patients where pat_in_no = @pat_in_no) return -1 --传入参数找不到信息

BEGIN TRANSACTION
declare cur cursor for 
        select pat_id from patients where pat_in_no = @pat_in_no

select @pat_id = '' 

open cur
while 1 = 1 
begin
      fetch next from cur into @pat_id
      
      if @@FETCH_STATUS<>0 break

      BEGIN TRANSACTION
      insert into test 
      values (@pat_id)
--插入失败处理
       IF @@ERROR <> 0 GOTO ERROR_PROC 

      ---执行第二个存储过程
      --判断返回值
      --@ret = 另一存储过程返回值
      select @ret = -1 --假设一个返回值值得????为什么执行
--ROLLBACK TRANSACTION报错?????????
  if @ret > 0
        COMMIT TRANSACTION
  else 
    begin
SELECT @ret
ROLLBACK TRANSACTION
  end

end 

close cur --关闭游标
DEALLOCATE cur --删除游标
COMMIT TRANSACTION
return

ERROR_PROC:
  close cur --关闭游标
  DEALLOCATE cur --删除游标
  ROLLBACK TRANSACTION
  select @pat_id+'失败'
  return

执行exec [test1abc]'00',@ret = -1 回滚。在查询分析器报错:
消息 3902,级别 16,状态 1,过程 test1abc,第 43 行
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
------解决方案--------------------
sql 不支持嵌套事务


------解决方案--------------------
在嵌套事务中 rollback 将会回滚所有事务
可用@@trancount 判断嵌套层数,commit transaction 会使@@trancount相应的减少1
------解决方案--------------------
sql支持嵌套事务,但是你的begin tran 和commit要配对,rollback会回滚整个事务,你可以看看你那里没有配对的,而且错误判断也不够
------解决方案--------------------
分段调试 分段查看事务的匹配情况。
  相关解决方案