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
  • 相关阅读:
    13 数据库主从
    12 数据备份
    11 锁机制
    12 日志
    10 索引(二)
    09 索引
    update kernel 3.10-3.12
    haproxy para config
    mysql slave to master
    storage disk
  • 原文地址:https://www.cnblogs.com/xuannian/p/9700119.html
Copyright © 2011-2022 走看看