현재 선택한 SQL 과정

SQLP 이론 학습

이론 목록으로 돌아가기

TCL과 트랜잭션 경계

COMMIT·ROLLBACK·SAVEPOINT와 Oracle DDL의 묵시적 커밋을 한 흐름으로 이해한다.

예상 읽기 6

핵심 요약

COMMIT·ROLLBACK·SAVEPOINT와 Oracle DDL의 묵시적 커밋을 한 흐름으로 이해한다.

핵심 질문

  1. TCL과 트랜잭션 경계에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
  2. 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
  3. 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
  4. 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?

학습 목표

  • 트랜잭션의 시작·종료와 SAVEPOINT의 역할을 설명한다.
  • Oracle과 SQL Server에서 DDL의 트랜잭션 처리 차이를 구분한다.

개념 지도

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
Transaction 시작 → 여러 DML → SAVEPOINT 선택 → COMMIT 또는 ROLLBACK

핵심 내용

트랜잭션은 논리적으로 하나인 작업 단위다. COMMIT은 변경을 확정하고, ROLLBACK은 아직 확정되지 않은 변경을 취소한다. SAVEPOINT는 트랜잭션 일부만 되돌릴 기준점을 만든다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
UPDATE account SET balance = balance - 100 WHERE id = 'A';
SAVEPOINT after_withdraw;
UPDATE account SET balance = balance + 100 WHERE id = 'B';
ROLLBACK TO after_withdraw;
COMMIT;

Oracle에서는 DDL 수행 전후에 묵시적 커밋이 발생할 수 있다. 따라서 다음 흐름에서 UPDATECREATE TABLE 수행 전에 확정되고, 이후 ROLLBACK으로 되돌아가지 않는다. 생성된 테이블도 남는다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
UPDATE a SET val = 200 WHERE id = '001';
CREATE TABLE b (id CHAR(3) PRIMARY KEY);
ROLLBACK;

반면 SQL Server에서는 명시적 트랜잭션 안의 DDL이 롤백될 수 있다. 문제에서 DBMS와 AUTO COMMIT 조건을 반드시 확인한다.

흔한 오해와 주의점

  • Oracle에서 DDL 성공 후 ROLLBACK하면 생성 객체가 사라진다고 단정하지 않는다.
  • SAVEPOINT로 롤백해도 트랜잭션 전체가 끝나는 것은 아니다.
  • COMMIT은 데이터 확정뿐 아니라 관련 잠금 해제와도 연결된다.

문항 풀이 보강: ACID·격리 이상·DBMS 차이

속성의미
원자성전부 성공하거나 전부 취소
일관성트랜잭션 전후 제약과 업무 규칙 유지
격리성동시 트랜잭션의 중간 상태가 서로 간섭하지 않음
지속성커밋한 결과가 장애 뒤에도 보존

격리 수준이 낮으면 다음 현상을 구분해야 한다.

  • Dirty Read: 다른 트랜잭션이 아직 커밋하지 않은 값을 읽음
  • Non-repeatable Read: 같은 행을 다시 읽었더니 다른 트랜잭션의 수정·삭제로 값이 달라짐
  • Phantom Read: 같은 범위 조건을 다시 조회했더니 행 집합이 늘거나 줄어듦
  • Lost Update: 동시 수정 중 한 변경이 다른 변경을 덮어씀

SAVEPOINT와 중첩 흐름

ROLLBACK TO savepoint는 지정 지점 이후만 취소하고 트랜잭션을 계속한다. 전체 ROLLBACK은 아직 커밋되지 않은 전체 변경을 취소한다. SQL Server의 중첩 BEGIN TRANSACTION은 독립된 물리 트랜잭션 여러 개라기보다 카운트를 증가시키는 성격이 있어 내부 COMMIT만으로 변경이 최종 확정되지 않을 수 있다.

Oracle과 SQL Server의 DDL

Oracle DDL은 실행 전에 앞선 DML을 묵시적으로 커밋하고, 성공한 DDL도 커밋된다. 이후 ROLLBACK으로 앞선 UPDATE나 생성 객체를 되돌리지 못한다. SQL Server에서는 명시적 트랜잭션에 포함한 많은 DDL을 함께 롤백할 수 있다.

문제에 적용하는 순서

  1. DBMS와 AUTO COMMIT 조건을 찾는다.
  2. 각 COMMIT·DDL 직전까지 확정된 변경을 표시한다.
  3. SAVEPOINT 또는 중첩 트랜잭션이면 취소 범위를 그린다.
  4. 동시에 두 번 읽는 문제는 값 변화인지 행 집합 변화인지 구분한다.

Transaction 시작과 종료

Oracle에서는 일반적으로 첫 DML이 Transaction을 시작하고 COMMIT 또는 ROLLBACK이 끝낸다. DDL은 전후 암시적 Commit을 일으킬 수 있으므로 업무 DML 중간에 섞지 않는다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
UPDATE account SET balance = balance - 10000 WHERE id = 1;
SAVEPOINT after_withdraw;
UPDATE account SET balance = balance + 10000 WHERE id = 2;

-- 두 번째 작업만 취소할 수 있지만 첫 UPDATE는 Transaction에 남음
ROLLBACK TO after_withdraw;
COMMIT;

ROLLBACK TO SAVEPOINT는 Transaction 전체를 끝내지 않고 해당 지점 이후만 되돌린다. Savepoint 이후 생성된 일부 Savepoint의 유효성 규칙도 확인한다.

경계 설계 원칙

  • 업무적으로 함께 성공해야 하는 SQL을 하나의 Transaction으로 묶는다.
  • 사용자 입력이나 외부 API 응답을 기다리며 Row Lock을 오래 보유하지 않는다.
  • 성능을 위해 임의 중간 Commit을 넣어 원자성을 깨지 않는다.
  • 예외 발생 시 Connection Pool에 반환하기 전에 반드시 Rollback한다.

Commit 성공은 Redo의 영속성을 뜻하며 변경 Block이 모두 Datafile에 기록됐다는 뜻은 아니다.


결과를 검증하는 순서

  1. 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
  2. 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
  3. NULL 비교가 TRUE, FALSE, UNKNOWN 중 무엇인지 구분합니다.
  4. 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
  5. 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.

실무와 시험에서 함께 확인할 항목

  • ORDER BY가 없다면 결과 순서를 가정하지 않습니다.
  • 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
  • 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
  • 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.

마지막 점검

  • 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
  • NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
  • ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.
  • 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.

복습 문제

  1. Oracle에서 DML 다음 DDL을 수행하면 앞선 DML은 어떻게 되는가?
  2. ROLLBACK TO SAVEPOINT와 전체 ROLLBACK의 차이는?
  3. 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
  4. NULL이 포함될 때 결과가 달라지는 지점은 어디인가?