복붙노트

[SQL] SQL Server의 트랜잭션의 올바른 사용

SQL

SQL Server의 트랜잭션의 올바른 사용

나는이 개 명령이 있고 둘 다 제대로 실행 또는 그들 중 누구도 실행되지해야합니다. 내가 생각하는 그래서 나는 트랜잭션이 필요하지만 올바르게 사용하는 방법을 모르겠어요.

다음 스크립트의 문제는 무엇입니까?

BEGIN TRANSACTION [Tran1]

INSERT INTO [Test].[dbo].[T1]
    ([Title], [AVG])
VALUES ('Tidd130', 130), ('Tidd230', 230)

UPDATE [Test].[dbo].[T1]
  SET [Title] = N'az2' ,[AVG] = 1
  WHERE [dbo].[T1].[Title] = N'az'

COMMIT TRANSACTION [Tran1]
GO

INSERT 명령이 실행되지만, UPDATE 명령은 문제가있다.

그 중 하나가 실행에 오류가있을 경우 어떻게이 두 명령을 롤백 구현할 수있다?

해결법

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

    1.트랜잭션이 트랜잭션이 롤백 실패 할 경우 트랜잭션이, 그 변경 내용을 커밋합니다 성공하면, try / catch 블록을 추가합니다 :

    트랜잭션이 트랜잭션이 롤백 실패 할 경우 트랜잭션이, 그 변경 내용을 커밋합니다 성공하면, try / catch 블록을 추가합니다 :

    BEGIN TRANSACTION [Tran1]
    
      BEGIN TRY
    
          INSERT INTO [Test].[dbo].[T1] ([Title], [AVG])
          VALUES ('Tidd130', 130), ('Tidd230', 230)
    
          UPDATE [Test].[dbo].[T1]
          SET [Title] = N'az2' ,[AVG] = 1
          WHERE [dbo].[T1].[Title] = N'az'
    
          COMMIT TRANSACTION [Tran1]
    
      END TRY
    
      BEGIN CATCH
    
          ROLLBACK TRANSACTION [Tran1]
    
      END CATCH  
    
  2. ==============================

    2.저장 프로 시저의 처음 부분에서 오류가 발생하는 경우에 자동으로 롤백 거래는 SQL 서버에 지시하려면 SET XACT_ABORT ON을 넣어해야합니다. ommited 각 문 또는 사용 TRY ... CATCH 롤백 블록 후 OFF로 테스트 @@ ERROR 한 요구 사항을 설정합니다.

    저장 프로 시저의 처음 부분에서 오류가 발생하는 경우에 자동으로 롤백 거래는 SQL 서버에 지시하려면 SET XACT_ABORT ON을 넣어해야합니다. ommited 각 문 또는 사용 TRY ... CATCH 롤백 블록 후 OFF로 테스트 @@ ERROR 한 요구 사항을 설정합니다.

  3. ==============================

    3.쉬운 방법 :

    쉬운 방법 :

    CREATE TABLE T
    (
        C [nvarchar](100) NOT NULL UNIQUE,
    );
    
    SET XACT_ABORT ON -- Turns on rollback if T-SQL statement raises a run-time error.
    SELECT * FROM T; -- Check before.
    BEGIN TRAN
        INSERT INTO T VALUES ('A');
        INSERT INTO T VALUES ('B');
        INSERT INTO T VALUES ('B');
        INSERT INTO T VALUES ('C');
    COMMIT TRAN
    SELECT * FROM T; -- Check after.
    DELETE T;
    
  4. from https://stackoverflow.com/questions/10153648/correct-use-of-transactions-in-sql-server by cc-by-sa and MIT license