很简单,你看看代码一目了然,放在现在位置,缺了begin tran和他配对,而放在最后是因为你的
goto语句转到上面了,没有执行到rollback tran所以才不报错.

解决方案 »

  1.   

    begin trancommit tran适于放在外层,另外在begin tran 前加SET XACT_ABORT ON 确保事务处理的整体提交或整体回滚SET XACT_ABORT
    指定当 Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。详细信息,查看帮助联机
      

  2.   

    那根据我现在的代码,我的begin tran和commit tran都应该放在什么位置上呢?请教指
      

  3.   


    create proc p_insert
    (
    @username varchar(50),
    @address varchar(60),
    @intro varchar(400),
    @return_name varchar(50) output
    )
    asset nocount onset xact_abort ondeclare @err int,@errcount int
    set @errcount=0LockTimeOutRetry:if exists (select * from ad_vip where username=@username)
    begin
            begin tran
                    insert usertable
                    select @username,@address,@intro        set @err=@@error
            if @err<>0
            begin
                    rollback tran
                    goto ErrorHandler
            end
            else
            begin
                    commit tran
                    return 0
            end
    end
    else
    begin
            set @return_name='用户名不存在'
            return -100
    end
    ErrorHandler:
    if (@err=1222 or @err=1205) and @errcount=5
    begin
            raiserror('错误',16,1)
            return -100
    endif @err=1222 or @err=1205
    begin
            waitfor delay '00:00:00.25'
            set @errcount=@errcount+1
            goto LockTimeOutRetry
    endGO
    --调用declare @ret int,@output varchar(1000)exec @ret=p_insert 'tom','Beijing','test',@output outputselect @ret,@output