| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- AWS
- sql
- TryHackMe
- AWS 3 Tier Architecture
- operating system
- 파일 시스템
- python
- AWS 보안 아키텍처 분석
- Database
- 버퍼 오버플로우
- C
- programmers
- 리버싱
- 프로그래머스
- reversing.kr
- CrackMe 문제
- 악성코드분석
- AWS 침해사고 사례 분석
- AWS 침해 사고 사례 분석
- reversing
- terraform
- network
- 네트워크
- Amazon S3
- 드림핵
- 악성코드 분석
- crackme
- dreamhack
- AWS 사고 사례 분석
- 운영체제
- Today
- Total
lhywk 님의 블로그
[DB] 트랜잭션과 동시성 제어 - ACID, 격리 수준, 락 본문
1. 트랜잭션
트랜잭션(Transaction)은 데이터베이스에서 하나의 논리적인 작업 단위를 구성하는 일련의 연산들을 의미한다. 예를 들어 계좌 이체는 "보내는 사람의 계좌에서 돈을 빼는 연산"과 "받는 사람의 계좌에 돈을 더하는 연산"이라는 두 개의 개별적인 연산으로 이루어지지만, 이 두 연산은 항상 함께 성공하거나 함께 실패해야 하는 하나의 작업 단위로 취급되어야 한다. 이런 작업 단위가 바로 트랜잭션이다.


2. ACID 속성
트랜잭션이 안전하게 수행되기 위해서는 다음과 같은 네 가지 속성을 만족해야 하는데, 이를 각 속성의 영문 앞글자를 따서 ACID라고 부른다.
원자성
원자성(Atomicity)은 트랜잭션에 포함된 작업들이 전부 실행되거나, 혹은 전부 실행되지 않아야 한다는 속성이다. 앞서 예로 든 계좌 이체에서, 돈을 빼는 연산은 성공했는데 더하는 연산이 실패한다면 돈이 허공으로 사라지는 셈이 된다. 원자성은 이런 중간 상태가 발생하지 않도록 보장한다. 만약 트랜잭션 중간에 문제가 생기면 ROLLBACK을 통해 트랜잭션 시작 이전 상태로 완전히 되돌린다.


일관성
일관성(Consistency)은 트랜잭션이 수행되기 전과 후에 데이터베이스가 항상 정해진 규칙(무결성 제약조건 등)을 만족하는 상태를 유지해야 한다는 속성이다. 무결성 제약조건들이 트랜잭션 수행 전후에도 계속 지켜져야 한다는 의미로 이해할 수 있다.


독립성
독립성(Isolation)은 동시에 실행되는 여러 트랜잭션이 서로의 중간 작업 결과에 영향을 주지 않아야 한다는 속성이다. 각 트랜잭션은 마치 자신만 데이터베이스를 사용하고 있는 것처럼 독립적으로 수행되어야 한다. 이 속성이 제대로 지켜지지 않으면 다음 절에서 설명할 여러 동시성 문제가 발생한다.


지속성
지속성(Durability)은 트랜잭션이 성공적으로 완료(커밋)되면, 그 결과는 시스템에 장애가 발생하더라도 영구적으로 보존되어야 한다는 속성이다. 커밋된 데이터는 정전이나 시스템 충돌이 일어나도 손실되지 않아야 한다.
3. 동시성 문제
여러 트랜잭션이 동시에 실행될 때 독립성이 제대로 보장되지 않으면 다음과 같은 문제들이 발생할 수 있다.
더티 리드
더티 리드(Dirty Read)는 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 사항을 읽어버리는 문제이다. 만약 그 변경 사항이 이후에 롤백된다면, 앞선 트랜잭션은 실제로는 존재하지 않았던 값을 읽고 잘못된 처리를 하게 된다.
다음 그림은 더티 리드가 발생하는 과정을 보여준다.

반복 불가능한 읽기
반복 불가능한 읽기(Non-Repeatable Read)는 한 트랜잭션 안에서 같은 데이터를 두 번 읽었는데, 그 사이에 다른 트랜잭션이 그 데이터를 변경하고 커밋해버려서 두 번의 읽기 결과가 서로 다르게 나타나는 문제이다.
팬텀 리드
팬텀 리드(Phantom Read)는 한 트랜잭션이 특정 조건으로 여러 행을 조회했는데, 그 사이에 다른 트랜잭션이 그 조건에 맞는 새로운 행을 삽입하거나 삭제해서, 같은 조건으로 다시 조회했을 때 처음과 다른 행의 집합이 나타나는 문제이다. 반복 불가능한 읽기는 기존 행의 값이 바뀌는 문제이고, 팬텀 리드는 행의 개수 자체가 바뀌는 문제라는 차이가 있다.
4. 트랜잭션 격리 수준
데이터베이스는 위에서 설명한 동시성 문제를 어느 정도까지 허용할지를 격리 수준(Isolation Level)이라는 설정으로 조절할 수 있다. 격리 수준은 낮을수록 동시성 문제가 더 많이 발생할 수 있지만 성능은 좋아지고, 높을수록 동시성 문제는 줄어들지만 성능이 떨어지는 경향이 있다. 즉 데이터의 정확성과 처리 성능 사이의 트레이드오프 관계에 있다.
격리 수준은 보통 다음과 같은 네 단계로 구분된다.
READ UNCOMMITTED는 가장 낮은 격리 수준으로, 다른 트랜잭션이 커밋하지 않은 데이터까지도 읽을 수 있다.
READ COMMITTED는 다른 트랜잭션이 커밋한 데이터만 읽을 수 있도록 해서 더티 리드를 방지한다.
REPEATABLE READ는 트랜잭션이 시작된 시점의 데이터를 트랜잭션이 끝날 때까지 동일하게 읽을 수 있도록 보장해서, 더티 리드와 반복 불가능한 읽기를 방지한다.
SERIALIZABLE은 가장 높은 격리 수준으로, 트랜잭션들이 마치 순차적으로 실행되는 것처럼 완전히 독립적으로 동작하도록 만들어서 팬텀 리드까지 방지한다.
다음 표는 각 격리 수준에서 어떤 동시성 문제가 발생할 수 있는지를 정리한 것이다.
| 격리 수준 | 더티 리드 | 반복 불가능한 읽기 | 팬텀 리드 |
| READ UNCOMMITTED | 발생 가능 | 발생 가능 | 발생 가능 |
| READ COMMITTED | 방지 | 발생 가능 | 발생 가능 |
| REPEATABLE READ | 방지 | 방지 | 발생 가능 |
| SERIALIZABLE | 방지 | 방지 | 방지 |
5. 락
격리 수준을 실제로 구현하는 대표적인 방법이 바로 락(Lock)이다. 락은 한 트랜잭션이 데이터에 접근하는 동안 다른 트랜잭션이 그 데이터에 접근하지 못하도록 막는 장치이다.
락의 종류
공유 락(Shared Lock)은 데이터를 읽을 때 사용하는 락으로, 한 트랜잭션이 공유 락을 걸어둔 데이터에는 다른 트랜잭션도 동시에 공유 락을 걸고 읽을 수 있다. 다만 공유 락이 걸려 있는 동안에는 데이터를 수정하는 것은 허용되지 않는다.
배타 락(Exclusive Lock)은 데이터를 수정할 때 사용하는 락으로, 한 트랜잭션이 배타 락을 걸어둔 데이터에는 다른 어떤 트랜잭션도 공유 락이든 배타 락이든 추가로 걸 수 없다. 배타 락이 풀릴 때까지 다른 트랜잭션은 그 데이터를 읽거나 쓸 수 없다.
데드락
락을 사용해서 동시성을 제어하다 보면 데드락(Deadlock)이라는 새로운 문제가 발생할 수 있다. 데드락은 두 개 이상의 트랜잭션이 서로 다른 트랜잭션이 점유한 자원을 기다리면서, 어느 쪽도 더 이상 진행하지 못하고 영원히 멈춰버리는 상황을 의미한다.
다음 그림은 데드락이 발생하는 구조를 보여준다.

그림에서 볼 수 있듯, 트랜잭션 A는 자원 1을 점유한 채로 트랜잭션 B가 점유한 자원 2를 기다리고 있고, 동시에 트랜잭션 B는 자원 2를 점유한 채로 트랜잭션 A가 점유한 자원 1을 기다리고 있다. 이렇게 서로가 서로를 기다리는 순환 구조가 만들어지면, 외부에서 개입하지 않는 한 두 트랜잭션은 영원히 멈춘 상태로 남는다.
데드락 해결 방법
데드락을 해결하는 방법은 크게 예방과 탐지로 나눌 수 있다.
예방 방식은 트랜잭션이 자원에 접근하는 순서를 미리 정해두거나, 트랜잭션이 필요한 모든 자원을 한 번에 미리 확보하도록 강제해서 데드락이 발생할 조건 자체를 차단하는 방식이다.
탐지 방식은 데드락이 실제로 발생했는지를 주기적으로 검사하고, 데드락이 발견되면 그 중 하나의 트랜잭션을 강제로 종료(롤백)시켜서 나머지 트랜잭션이 진행될 수 있도록 하는 방식이다. 대부분의 실제 DBMS는 이 탐지 방식을 채택해서, 데드락이 발견되면 둘 중 작업량이 적은 트랜잭션을 자동으로 희생시키고 그 사실을 오류로 알려준다.
'Database' 카테고리의 다른 글
| [DB] SQL 활용 - JOIN, 서브쿼리, GROUP BY, 윈도우 함수 (0) | 2026.06.24 |
|---|---|
| [DB] SQL - DDL, DML, DCL, TCL (0) | 2026.06.24 |
| [DB] 정규화 - 이상 현상부터 BCNF까지 (0) | 2026.06.24 |
| [DB] 데이터 모델링 - ERD, 개체와 속성, 관계 (0) | 2026.06.24 |
| [DB] 관계대수 - 셀렉션, 프로젝션, 집합연산, 조인, 디비전 (0) | 2026.06.18 |