SQL Server - 트랜잭션 롤백 오류 발생?
다음과 같은 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;
1개의 긴 문자열 명령어로 전송됩니다.
삽입 중 하나가 실패하거나 명령어 중 하나가 실패하면 SQL Server는 트랜잭션을 롤백합니까?롤백되지 않으면 롤백하기 위한 두 번째 명령을 전송해야 합니까?
사용하는 API와 언어에 대한 자세한 내용은 알려드릴 수 있지만 SQL Server는 어떤 언어에서도 동일하게 응답해야 한다고 생각합니다.
넣을 수 있습니다.set xact_abort on오류 발생 시 SQL이 자동으로 롤백되도록 하기 위해 트랜잭션 전에 미리 확인하십시오.
전체 트랜잭션이 롤백된다는 점에서 정답입니다.롤백하는 명령어를 발행해야 합니다.
이것은 포장이 가능합니다.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
-- <EDIT>: From SQL2008 on, you must raise error messages as follows:
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
-- </EDIT>
END CATCH
다음은 MSQL Server 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
MDSN 기사 "Controlling Transactions (Database Engine)"를 참조하십시오.
런타임 스테이트먼트 오류(예: 제약 조건 위반)가 일괄적으로 발생할 경우 데이터베이스 엔진의 기본 동작은 오류를 생성한 스테이트먼트만 롤백하는 것입니다.이 동작은 SET XACT_ABORT 문을 사용하여 변경할 수 있습니다.SET XACT_ABORT ON 실행 후 런타임스테이트먼트 오류가 발생하면 현재 트랜잭션이 자동으로 롤백됩니다.구문 오류 등의 컴파일 오류는 SET XACT_ABORT의 영향을 받지 않습니다.자세한 내용은 SET XACT_ABORT(Transact-SQL)를 참조하십시오.
이 경우 삽입이 실패하면 전체 트랜잭션이 롤백됩니다.
삽입 중 하나가 실패하거나 명령어 중 하나가 실패하면 SQL Server는 트랜잭션을 롤백합니까?
아니, 그렇지 않아.
롤백되지 않으면 롤백하기 위한 두 번째 명령을 전송해야 합니까?
네, 발행하셔야 합니다.ROLLBACK대신COMMIT.
트랜잭션을 커밋할지 롤백할지 결정하려면COMMIT문장에서 제외하여 삽입 결과를 확인하고 다음 중 하나를 발행합니다.COMMIT또는ROLLBACK검사 결과에 따라 다릅니다.
언급URL : https://stackoverflow.com/questions/1749719/sql-server-transactions-roll-back-on-error
'source' 카테고리의 다른 글
| 클릭 후 WPF 버튼이 강조 표시된 상태로 유지되지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
|---|---|
| 목록에서 무작위로 50개 항목 선택 (0) | 2023.04.12 |
| SQL Server의 숨겨진 기능 (0) | 2023.04.07 |
| SQL Server 출력 절을 스칼라 변수로 변환 (0) | 2023.04.07 |
| SQL에서 월의 첫 번째 날을 선택하려면 어떻게 해야 합니까? (0) | 2023.04.07 |