CREATE PROCEDURE dp_inseruser
@id char(50),
@pwd char(50),
@name char(50),
@num int
AS
BEGIN TRANSACTION 
insert userinfo(id,pwd,name,num) values                (@id,@pwd,@name,@num)
if @@error<>0 
              begin
                  rollback TRANSACTION
                 return 
              end
insert logininfo(m_user,m_time,m_ip) values(@name,@id,@pwd)
if @@error<>0 
              begin
                  rollback TRANSACTION
                 return 
              end
             COMMIT TRANSACTION
要进行两次判断,因为两次的操作返回是不一样的

解决方案 »

  1.   

    CREATE PROCEDURE dp_inseruser
    @id char(50),
    @pwd char(50),
    @name char(50),
    @num int
    AS
    declare @errorcount int
    set @errorcount = 0
    BEGIN TRANSACTION 
    insert userinfo(id,pwd,name,num) values                (@id,@pwd,@name,@num)
    set @errorcount = @errorcount + @error
    insert logininfo(m_user,m_time,m_ip) values(@name,@id,@pwd)
    set @errorcount = @errorcount + @error
    if @errorcount>0 
                  begin
                      rollback TRANSACTION
                     return 
                  end
                 COMMIT TRANSACTION
    GO
      

  2.   

    回滚处理不应该在begin tran 和commit tran中间,应该在commit tran 之外处理,比如:
    ……
    begin tran
    ……
       if @@error<>0  goto OnError  --出了错误到OnError段处理
    ……
    commit tran
      
    OnError:  rollback tran你可以做做测试。
      

  3.   

    CREATE PROCEDURE dp_inseruser
    @id char(50),
    @pwd char(50),
    @name char(50),
    @num int
    AS
    BEGIN TRANSACTION 
    insert userinfo(id,pwd,name,num) values                (@id,@pwd,@name,@num)
    if @@error<>0 
                  begin
                      rollback TRANSACTION
                     return 
                  end
    insert logininfo(m_user,m_time,m_ip) values(@name,@id,@pwd)
    if @@error<>0 
                  begin
                      rollback TRANSACTION
                     return 
                  end
                 COMMIT TRANSACTION
    GO