반응형
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
반응형
'source' 카테고리의 다른 글
SQL - 문자열을 검색하는 동안 대/소문자 무시 (0) | 2023.04.07 |
---|---|
첫 번째 줄에 가입하는 방법 (0) | 2023.04.07 |
SQL Server에서 테이블 이름을 변경하는 방법 (0) | 2023.04.07 |
SQL Server에서 날짜/시간을 자르는 방법은 무엇입니까? (0) | 2023.04.07 |
Output 매개 변수를 사용하여 저장 프로시저를 실행하시겠습니까? (0) | 2023.04.07 |