복붙노트

[SQL] SQL 서버 - 오류에 거래 롤 다시?

SQL

SQL 서버 - 오류에 거래 롤 다시?

우리는 다음과 같은 SQL Server 2005의 몇 가지 SQL을 실행하는 클라이언트 응용 프로그램이 있습니다

BEGIN TRAN;
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
COMMIT TRAN;

그것은 하나의 긴 문자열 명령으로 전송됩니다.

인서트 중 하나가 실패 또는 명령의 일부가 실패하면 다시 트랜잭션을 SQL 서버 롤합니까? 그렇지 롤백 않으면, 내가 다시 롤 두 번째 명령을 전송해야합니까?

제가 사용하고있는 API와 언어에 대한 세부 사항을 제공 할 수 있습니다,하지만 난 SQL 서버는 모든 언어에 대해 동일한 응답해야한다고 생각합니다.

해결법

  1. ==============================

    1.당신은 당신의 트랜잭션을 확인 SQL 롤 오류가 발생하는 경우 자동으로 다시 만드는 전에 설정 XACT_ABORT를 넣을 수 있습니다.

    당신은 당신의 트랜잭션을 확인 SQL 롤 오류가 발생하는 경우 자동으로 다시 만드는 전에 설정 XACT_ABORT를 넣을 수 있습니다.

  2. ==============================

    2.당신은 전체 트랜잭션이 롤백됩니다에서 올바른. 당신은 그것을 롤백 명령을 실행해야합니다.

    당신은 전체 트랜잭션이 롤백됩니다에서 올바른. 당신은 그것을 롤백 명령을 실행해야합니다.

    다음과 같이 당신은 TRY의 CATCH 블록이 포장 할 수 있습니다

    BEGIN TRY
        BEGIN TRANSACTION
    
            INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
            INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
            INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
    
        COMMIT TRAN -- Transaction Success!
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRAN --RollBack in case of Error
    
        -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception
        RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)
    END CATCH
    
  3. ==============================

    3.MSSQL 서버 2016 작업 오류 메시지가 표시와 함께 코드 여기 :

    MSSQL 서버 2016 작업 오류 메시지가 표시와 함께 코드 여기 :

    BEGIN TRY
        BEGIN TRANSACTION 
            -- Do your stuff that might fail here
        COMMIT
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRAN
    
            DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE()
            DECLARE @ErrorSeverity INT = ERROR_SEVERITY()
            DECLARE @ErrorState INT = ERROR_STATE()
    
        -- Use RAISERROR inside the CATCH block to return error  
        -- information about the original error that caused  
        -- execution to jump to the CATCH block.  
        RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
    END CATCH
    
  4. ==============================

    4.MDSN 기사, 트랜잭션 제어 (데이터베이스 엔진)에서.

    MDSN 기사, 트랜잭션 제어 (데이터베이스 엔진)에서.

    인서트가 실패 할 때 귀하의 경우는 전체 트랜잭션을 롤백합니다.

  5. ==============================

    5.아니 그렇지 않아.

    아니 그렇지 않아.

    물론, 당신은 ROLLBACK을 발행하는 대신 COMMIT한다.

    커밋 또는 트랜잭션을 롤백 여부를 결정하려는 경우, 삽입의 결과를 확인하십시오이 문에서 문장을 COMMIT 제거하고 검사 결과에 따라 COMMIT 또는 ROLLBACK 중 하나를 실행해야합니다.

  6. from https://stackoverflow.com/questions/1749719/sql-server-transactions-roll-back-on-error by cc-by-sa and MIT license