본문으로 건너뛰기
SQLD 준비실
이론 전체 목차 열기 19 / 32

SQL 기본 및 활용 · 제약조건과 트랜잭션 19 / 32

제약조건과 트랜잭션 상세

PK/FK/UNIQUE/CHECK 제약조건과 ACID, 격리 수준, CASCADE 옵션을 시험 풀이 기준으로 정리합니다.

출제 빈도 ★★★☆☆ 관련 문제 6개 | PKFKCHECKACIDISOLATION

제약조건 6종

제약조건(Constraint)은 테이블에 입력되는 값의 유효성을 DB 수준에서 강제합니다. 애플리케이션 코드에 의존하지 않고 데이터 무결성을 지킵니다.

제약역할특징
NOT NULLNULL 입력 금지단일 컬럼
UNIQUE중복 값 금지NULL은 여러 개 허용 (Oracle)
PRIMARY KEY유일성 + NOT NULL테이블당 1개 (복합키 가능)
FOREIGN KEY다른 테이블의 PK/UNIQUE 참조NULL 허용 가능
CHECK값의 범위 조건CHECK (sal > 0)
DEFAULT기본값 지정엄밀히는 제약이 아닙니다 (기본값)
CREATE TABLE emp (
  empno   NUMBER(4)  PRIMARY KEY,
  ename   VARCHAR2(10) NOT NULL,
  sal     NUMBER(7,2) CHECK (sal > 0),
  deptno  NUMBER(2)  REFERENCES dept(deptno),
  hired   DATE       DEFAULT SYSDATE
);

제약조건 추가·제거

-- 이미 만들어진 테이블에 FK 추가
ALTER TABLE emp
  ADD CONSTRAINT fk_emp_dept
  FOREIGN KEY (deptno) REFERENCES dept(deptno);

-- 제약 비활성화·활성화 (삭제 대신)
ALTER TABLE emp DISABLE CONSTRAINT fk_emp_dept;
ALTER TABLE emp ENABLE  CONSTRAINT fk_emp_dept;

-- 제약 삭제
ALTER TABLE emp DROP CONSTRAINT fk_emp_dept;

FK 참조 동작 — ON DELETE / ON UPDATE

부모 행이 삭제·수정될 때 자식 행을 어떻게 처리할지 지정합니다.

옵션부모 삭제 시 자식은?
(기본) NO ACTION / RESTRICT삭제 실패 (자식 존재 시 오류)
CASCADE함께 삭제
SET NULL자식 FK 컬럼을 NULL로 설정
SET DEFAULT기본값으로 설정 (DBMS별 지원 차이)
ALTER TABLE orders
  ADD CONSTRAINT fk_order_cust
  FOREIGN KEY (cust_id) REFERENCES customer(cust_id)
  ON DELETE CASCADE;

트랜잭션의 ACID

트랜잭션은 여러 SQL을 하나의 논리 작업 단위로 묶는 메커니즘입니다. 네 가지 성질이 보장되어야 합니다.

글자이름의미
AAtomicity (원자성)전부 반영되거나 전부 취소
CConsistency (일관성)트랜잭션 전후 무결성 제약 유지
IIsolation (고립성)동시 트랜잭션이 서로 간섭하지 않음
DDurability (지속성)커밋된 결과는 시스템 장애에도 보존

트랜잭션 격리 수준 (Isolation Level)

낮은 격리는 성능이 높고 일관성이 낮습니다. 높은 격리는 반대입니다. Oracle 기본값은 READ COMMITTED입니다.

격리 수준Dirty ReadNon-Repeatable ReadPhantom Read
READ UNCOMMITTED발생발생발생
READ COMMITTED (Oracle 기본)차단발생발생
REPEATABLE READ차단차단발생
SERIALIZABLE차단차단차단 (가장 엄격)
이상 현상의미
Dirty Read아직 커밋되지 않은 변경을 다른 트랜잭션이 읽음
Non-Repeatable Read같은 행을 두 번 읽었는데 값이 달라짐
Phantom Read같은 조건의 조회에 행 개수가 달라짐

Lock — 동시성 제어

Lock 종류

구분설명
Shared Lock (S)다른 세션도 읽기 가능, 쓰기는 불가
Exclusive Lock (X)다른 세션의 모든 접근 차단
Row-level Lock특정 행만 잠금 (Oracle 기본)
Table-level Lock테이블 전체 잠금 (LOCK TABLE ... IN EXCLUSIVE MODE)

데드락 (Deadlock)

두 트랜잭션이 서로의 락을 기다려 영원히 대기하는 상태입니다. Oracle은 자동 감지 후 한쪽을 강제 롤백합니다.

제약은 무결성을 지키고, 트랜잭션은 ACID로 묶이며, 격리 수준은 동시성과 일관성의 트레이드오프입니다.