<aside> 💡
트랜잭션은 데이터베이스에서 일련의 작업 단위를 뜻하며, 데이터의 일관성과 안정성을 보장합니다. 트랜잭션은 반드시 ACID 속성을 만족해야 합니다.
</aside>
Atomicity (원자성)
모든 작업이 완전하게 실행되거나, 전혀 실행되지 않은 상태를 보장합니다.
→ 실패 시: 변경사항을 모두 롤백(Rollback) 합니다.
Consistency (일관성)
트랜잭션 실행 전후에 데이터는 일관된 상태를 유지해야 합니다.
→ 예: 무결성 제약 조건 위배 방지.
Isolation (고립성)
트랜잭션 간의 작업이 상호 간섭 없이 독립적으로 실행됩니다.
→ 트랜잭션 중간 결과가 다른 트랜잭션에 영향을 주지 않습니다.
Durability (지속성)
트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 저장됩니다.
→ 시스템 오류 발생 시에도 데이터가 유지됩니다.
명령어 | 설명 |
---|---|
BEGIN |
트랜잭션을 시작합니다. |
COMMIT |
트랜잭션을 완료하고 모든 변경사항을 확정합니다. |
ROLLBACK |
트랜잭션을 취소하고 변경사항을 원래 상태로 복구합니다. |
SAVEPOINT name |
트랜잭션 내 특정 시점에 저장점(Savepoint)을 설정합니다. |
RELEASE SAVEPOINT name |
설정한 저장점을 해제합니다. |
트랜잭션 간의 상호작용을 제어하는 수준으로, 낮은 격리 수준일수록 성능은 향상되지만, 데이터 일관성 문제 위험이 증가합니다.
격리 수준 | 설명 | 문제 가능성 |
---|---|---|
Read Uncommitted | 커밋되지 않은 데이터도 읽을 수 있습니다. | Dirty Read, Non-Repeatable Read |
Read Committed | 커밋된 데이터만 읽을 수 있습니다. | Non-Repeatable Read |
Repeatable Read | 동일 트랜잭션 내에서 읽은 데이터는 항상 동일합니다. | Phantom Read |
Serializable | 가장 높은 격리 수준. 완전한 데이터 일관성을 보장하지만 성능 저하 우려. | 없음 |
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 조건: 계좌 잔액이 음수로 떨어지면 롤백
IF (SELECT balance FROM accounts WHERE id = 1) < 0 THEN
ROLLBACK;
ELSE
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
END IF;
설명:
- 트랜잭션이 시작되면 계좌에서 100을 차감하고 다른 계좌에 추가합니다.
- 도중에 오류 발생 시 ROLLBACK을 호출하여 상태를 복구합니다.