source

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

ittop 2023. 4. 7. 21:57
반응형

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

2개의 명령어를 가지고 있으며 둘 다 올바르게 실행하거나 실행하지 않으면 안됩니다.그래서 거래가 필요할 것 같은데 어떻게 사용하는지 모르겠어요.

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

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명령어에 문제가 있습니다.

두 명령어 중 하나라도 실행 중 오류가 발생했을 경우 롤백하려면 어떻게 해야 합니까?

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  

스토어드 프로시저를 시작할 때 SQL Server에 오류 발생 시 트랜잭션을 자동으로 롤백하도록 지시해야 합니다.생략 또는 OFF로 설정되어 있는 경우 각 문 뒤에 @@ERROR을 테스트하거나 TRY ... CATCH 롤백 블록을 사용해야 합니다.

간단한 접근:

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;

언급URL : https://stackoverflow.com/questions/10153648/correct-use-of-transactions-in-sql-server

반응형