zoukankan      html  css  js  c++  java
  • SQL Server @@ERROR的小误区大Bug

    在公司项目中看到有这样使用事务的:

    -- 开启事务
    BEGIN TRAN
        INSERT TABLE1(ID) VALUES (1)
        INSERT TABLE2(ID) VALUES (2)
        UPDATE TABLE3 SET ID=3
    IF @@ERROR > 0 
    BEGIN
        ROLLBACK TRAN
        RETURN 1003
    END
    COMMIT TRAN

    乍一看没啥问题,仔细思考就能发现有很大的问题。

    @@ERROR:并不是错误的计数器,而是没执行一条SQL语句就会产生一个新的@@ERROR。

    那有人就会觉得那只有一条增删改的时候就可以这么用。

    是可以,但是还是要谨慎。下面也是在公司项目中看到的错误例子:

    -- 开启事务
    BEGIN TRAN
        INSERT TABLE1(ID) VALUES (1)
        SET @New_ID = SCOPE_IDENTITY() 
    IF @@ERROR > 0 BEGIN ROLLBACK TRAN RETURN 1003 END COMMIT TRAN

     所以这种写法有很大的问题,这种问题就导致数据错乱。 

    正确使用事务:

    BEGIN TRY                -- 这里没有Try也是可以的
        SET XACT_ABORT ON;   -- 执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚
        BEGIN TRAN 
          INSERT INTO TABLE1 SELECT 1
          INSERT INTO TABLE2 SELECT 2
          UPDATE TABLE3 Set ID = 3 
        COMMIT TRANEND TRY
    BEGIN CATCH
        RAISERROR ('修改异常!',16,1)   --抛出异常
    END CATCH
  • 相关阅读:
    LaTeX插入数学公式
    清除浮动的4种方式
    水平居中与垂直居中
    如何实现两三栏布局
    BFC
    flex弹性盒子
    盒模型
    Git
    jQuery设置disabled属性与移除disabled属性
    TP---where多条件查询
  • 原文地址:https://www.cnblogs.com/xuannian/p/9700119.html
Copyright © 2011-2022 走看看