none
如何编写sql事务 RRS feed

  • 问题

  • 编写一个简单的sql事务 ,请教各位这样写事务是否正确

    我有两个表需要更新

    begin transaction

    INSERT INTO YK (编号) SELECT      编号  FROM         YK where ID=@ID     --插入表1

    update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID  --更新表2

     

    if @@ERROR<>0

    begin

    rollback transaction

    return

    end

    commit transaction

    2010年12月29日 9:25

答案

  • Castrandom, 用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌

    使用事务需要特别注意一个地方:@@ERROR<>0只能判断当前语句的执行结果!

    你这里begin transaction后面写了2条语句,如果第一条执行失败,而第二条执行成功,那么返回@@ERROR的结果是0(0表示成功);同样,如果第一条执行成功,而第二条执行失败,那么@@ERROR的结果是1哦。

    @@error只能判断当前一条语句执行是否有错,为了判断事务中所有语句是否有错,建议对错误进行累计;
    如:SET @errorSum=@errorSum+@@error,最后一步根据@errorSum来判断所有的语句是否成功。


    Thanks, Yoyo Yu
    2011年1月5日 6:13
  • --SQL2000:
    --方法1、
    
    begin TRANSACTION
    --.........................定義變量
    DECLARE @ID INT
    SET @ID=10
    
    INSERT INTO YK (编号) SELECT   编号 FROM     YK where ID=@ID   --插入表1
    if @@ERROR<>0
    	GOTO Error
    
    update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2
    
    if @@ERROR<>0
    	GOTO Error
     
    commit TRANSACTION
    RETURN
    
    ERROR:
    rollback TRANSACTION
    
    --方法2:
    
    SET XACT_ABORT ON ;--指定當 Transact-SQL 陳述式產生執行階段錯誤時,SQL Server 是否自動回復目前的交易。
    begin TRANSACTION
    --.........................定義變量
    DECLARE @ID INT
    SET @ID=10
    
    INSERT INTO YK (编号) SELECT   编号 FROM     YK where ID=@ID   --插入表1
    update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2
    
    COMMIT TRANSACTION
    
    --SQL2005以上版本用
    
    BEGIN TRY
    BEGIN TRAN
    --.........................定義變量
    DECLARE @ID INT
    SET @ID=10
    INSERT INTO YK (编号) SELECT   编号 FROM     YK where ID=@ID   --插入表1
    update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2
    COMMIT TRAN
    END TRY
    BEGIN CATCH
    DECLARE @Error NVARCHAR(2000)
    SET @Error=ERROR_MESSAGE()
    ROLLBACK TRAN
    RAISERROR 50001 @Error 
    END CATCH
    

    ROY WU(吳熹 )
    2011年1月5日 10:05
    版主

全部回复

  • 没啥问题啊,

    你可以在查询分析器里面试试。

    有问题在问哈


    family as water
    2010年12月29日 14:12
  • 你好,

    正如Stone 所言,你的语句没啥问题~

    你说你有2张表要更新,根据你语句,你只更新了GQK 这张表。

    更多关于事务的信息,你可以参阅下面的文档:

    事务

    谢谢,
    邱爱华


    Ai-hua Qiu[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2010年12月31日 8:43
  • Castrandom, 用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌

    使用事务需要特别注意一个地方:@@ERROR<>0只能判断当前语句的执行结果!

    你这里begin transaction后面写了2条语句,如果第一条执行失败,而第二条执行成功,那么返回@@ERROR的结果是0(0表示成功);同样,如果第一条执行成功,而第二条执行失败,那么@@ERROR的结果是1哦。

    @@error只能判断当前一条语句执行是否有错,为了判断事务中所有语句是否有错,建议对错误进行累计;
    如:SET @errorSum=@errorSum+@@error,最后一步根据@errorSum来判断所有的语句是否成功。


    Thanks, Yoyo Yu
    2011年1月5日 6:13
  • --SQL2000:
    --方法1、
    
    begin TRANSACTION
    --.........................定義變量
    DECLARE @ID INT
    SET @ID=10
    
    INSERT INTO YK (编号) SELECT   编号 FROM     YK where ID=@ID   --插入表1
    if @@ERROR<>0
    	GOTO Error
    
    update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2
    
    if @@ERROR<>0
    	GOTO Error
     
    commit TRANSACTION
    RETURN
    
    ERROR:
    rollback TRANSACTION
    
    --方法2:
    
    SET XACT_ABORT ON ;--指定當 Transact-SQL 陳述式產生執行階段錯誤時,SQL Server 是否自動回復目前的交易。
    begin TRANSACTION
    --.........................定義變量
    DECLARE @ID INT
    SET @ID=10
    
    INSERT INTO YK (编号) SELECT   编号 FROM     YK where ID=@ID   --插入表1
    update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2
    
    COMMIT TRANSACTION
    
    --SQL2005以上版本用
    
    BEGIN TRY
    BEGIN TRAN
    --.........................定義變量
    DECLARE @ID INT
    SET @ID=10
    INSERT INTO YK (编号) SELECT   编号 FROM     YK where ID=@ID   --插入表1
    update GQK set 数量= 结余数量*2 from GQK join YK on GQK.gid=YK.lid where YK.ID=@ID --更新表2
    COMMIT TRAN
    END TRY
    BEGIN CATCH
    DECLARE @Error NVARCHAR(2000)
    SET @Error=ERROR_MESSAGE()
    ROLLBACK TRAN
    RAISERROR 50001 @Error 
    END CATCH
    

    ROY WU(吳熹 )
    2011年1月5日 10:05
    版主