트랜잭션(Transaction)의 기초
트랜잭션이란 데이타베이스 처리 작업이 모두 완료되거나 아니면 모두 취소되게 되는 작업의 단위이다.
지금까지의 하나의 INSERT, UPDATE, DELETE (DML문) 등은 (별도의 설정 없이 내부적으로) 하나의 트랜잭션으로 볼 수 있다.
예를 들어, 하나의 DELETE문으로 10개의 레코드를 삭제할 때, 이는 하나의 트랜잭션이기 때문에, 5개는 지워지고 중간에 문제가 생겨
나머지 5개는 살아있는 상태가 되지 않는다는 것이다. 이런 에러 상황에서는 DELETE 자체가 취소되어 지워진 5개가 복원(rollback)된다.
하나의 SQL문에 대한 트랜잭션보다 좀 더 복잡한 트랜잭션을 쓸 경우는 있는데, 만약 여러 개의 INSERT, UPDATE, DELETE들을
복합적으로 사용해야 한다면, 트랜잭션의 시작(BEGIN TRAN)과 끝(COMMIT TRAN)을 명시적으로 표시해 주어야 한다.
트랜잭션 처리 SQL문
트랜잭션을 시작할 때는 BEGIN TRANSACTION (줄여서 BEGIN TRAN)을 사용하고,
트랜잭션이 성공적으로 완료된 경우는 COMMIT TRANSACTION을 사용한다.
만약 중간에 에러가 나서 취소할 경우는 ROLLBACK TRANSACTION을 사용한다.
아래는 INSERT와 UPDATE문 2개를 한 트랜잭션에서 실행하는데, 만약 UPDATE할 데이타가 테이블에 없는 경우 에러로 처리하고
트랜잭션을 롤백하는 예이다.
SAVE POINT의 사용
트랜잭션 안에서 부분적인 ROLLBACK을 필요로 하는 때가 있는데, 이 때 SAVE POINT를 이용한다.
예를 들어, 2개의 주문 테이블에 주문을 입력하고 1개의 로깅 테이블에 추가로 보조적으로 데이타를 넣는다고 했을 때,
2개의 주문 테이블에 실제 주문이 완료되고 로깅테이블에는 데이타 오류 발생하는 상황이 있을 수 있다.
이때 로깅테이블은 중요하지 않으므로 로깅 부분을 ROLLBACK하고 주문테이블 처리를 완료하게 할 수 있다.
이를 위해 주문테이블 완료에 SAVE POINT을 두고 로깅 실패 부분에서 ROLLBACK TRAN [SavePoint]를 실행하면
부분적인 트랜잭션 취소와 함께 중요 데이타 처리를 저장 완료할 수 있다.
아래 예는 Scores 테이블에 INSERT를 수행한 후, SAVE POINT를 설정해 두고 UPDATE를 실행하여 만약 UPDATE가
실패하면 지정된 SAVE POINT로 부분 취소를 하는 예로서, 이 경우 ScoreSavePoint로 이동한 후,
다음 블력인 INSERT Log 문장을 수행하게 된다. 따라서 Scores/Log 테이블에만 저장되고, UPDATE는 저장되지 않는다.
- @@ERROR는 직전 TSQL이 성공한 경우는 0을, 실패인 경우는 0 이외 에러값을 리턴한다.
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.