제약조건과 트랜잭션 상세
PK/FK/UNIQUE/CHECK 제약조건과 ACID, 격리 수준, CASCADE 옵션을 시험 풀이 기준으로 정리합니다.
출제 빈도 ★★★☆☆ 관련 문제 6개 |
PKFKCHECKACIDISOLATION 제약조건 6종
제약조건(Constraint)은 테이블에 입력되는 값의 유효성을 DB 수준에서 강제합니다. 애플리케이션 코드에 의존하지 않고 데이터 무결성을 지킵니다.
| 제약 | 역할 | 특징 |
|---|---|---|
NOT NULL | NULL 입력 금지 | 단일 컬럼 |
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을 하나의 논리 작업 단위로 묶는 메커니즘입니다. 네 가지 성질이 보장되어야 합니다.
| 글자 | 이름 | 의미 |
|---|---|---|
| A | Atomicity (원자성) | 전부 반영되거나 전부 취소 |
| C | Consistency (일관성) | 트랜잭션 전후 무결성 제약 유지 |
| I | Isolation (고립성) | 동시 트랜잭션이 서로 간섭하지 않음 |
| D | Durability (지속성) | 커밋된 결과는 시스템 장애에도 보존 |
트랜잭션 격리 수준 (Isolation Level)
낮은 격리는 성능이 높고 일관성이 낮습니다. 높은 격리는 반대입니다. Oracle 기본값은 READ COMMITTED입니다.
| 격리 수준 | Dirty Read | Non-Repeatable Read | Phantom 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로 묶이며, 격리 수준은 동시성과 일관성의 트레이드오프입니다.