티스토리 뷰
_트랜잭션이 보장해야 하는 ACID
-
Atomicity(원자성) : 한 트랜잭션 내에서 실행한 작업들은 하나의 작업으로 간주. 모두 성공 또는 실패되어야 한다.
-
Consistency(일관성) : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지
-
Isolation(격리성) : 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리
-
Durability(지속성) : 트랜잭션을 성공적으로 마치면 그 결과가 항상 저장되어야 한다.
격리성을 완벽히 보장하기 위해 모든 트랜잭션을 순차적으로 실행한다면 동시성 처리 이슈가 발생한다.
반대로 동시성을 높이기 위해 여러 트랜잭션을 병렬처리하게 되면 데이터의 무결성이 깨질 수 있다.
_격리성 관련 문제점
1) Dirty Read
한 트랜잭션(T1)이 데이터에 접근하여 값을 A에서 B로 변경했고, 아직 커밋을 하지 않았을 때
다른 트랜잭션(T2)이 해당 데이터를 Read하면
>> T2가 읽은 값은 B가 될 것. 하지만 T2가 가진 데이터는 꼬이게 된다.
2) Non-Repeatable Read
한 트랜잭션(T1)이 데이터를 Read하고 있다. 이때 다른 트랜잭션(T2)가 데이터에 접근하여 값을 변경/삭제 후 커밋을 하면
>> 그 후 T1이 다시 해당 데이터를 Read할 때 변경/삭제된 데이터를 찾게 된다.
3) Phantom Read
트랜잭션(T1) 중에 특정 조건으로 데이터를 검색하여 결과를 얻었다.
이 때 다른 트랜잭션(T2)가 접근해 해당 조건의 데이터 일부를 삭제/추가 했을 때, 아직 끝나지 않은 T1이 해당 조건으로 데이터를 조회하면 T2에서 추가/삭제된 데이터가 함께 조회/누락 된다.
그 후 T2가 롤백을하면 데이터가 꼬인다.
_트랙잭션 격리 수준
위와 같은 문제들 때문에, ANSI표준에서 트랜잭션의 격리성과 동시 처리 성능 사이의 Trade-off를 두고 4단계 격리수준을 나누었다.
내려갈수록 격리 수준이 높아져서 언급된 이슈는 적게 발생하지만 동시 처리 성능은 떨어진다.
참고로, 트랜잭션이 발생하면 락(Lock)이 걸리는데, SELECT 시에는 공유 락, CREATE/INSERT/DELETE 시에는 배타적 락이 걸린다
1) Read Uncommitted
한 트랜잭션에서 커밋하지 않은 데이터에 다른 트랜잭션이 접근 가능하다.
즉, 커밋하지 않은 데이터를 읽을 수 있다.
이 수준은 당연히 위에서 언급한 모든 문제에 대해 발생 가능성이 존재한다.
대신, 동시 처리 성능은 가장 높다.
발생 문제점 : Dirty Read, Non-Repeatable Read, Phantom Read
2) Read Committed
커밋이 완료된 데이터만 읽을 수 있다.
Dirty Read가 발생할 여지는 없으나, Uncommitted Read 수준보다 동시 처리 성능은 떨어진다.
대신 Non-Repeatable Read 및 Phantom Read는 발생 가능 하다.
데이터베이스들은 보통 Committed Read를 디폴트 수준으로 지정한다.
발생 문제점 : Non-Repeatable Read, Phantom Read
3) Repeatable Read
트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다.
이는 개별 데이터 이슈인 Dirty Read, Non-Repeatable Read는 발생하지 않지만,
결과 집합 자체가 달라지는 Phantom Read는 발생가능하다.
발생 문제점 : Phantom Read
4) Serializable
가장 엄격한 격리 수준
위 3가지 문제점을 모두 커버 가능하다. 하지만 동시 처리 성능은 급격히 떨어질 수 있다.
참고로 MySQL과 Oracle의 격리 수준은 다르다.
- MySQL : Repeatable Read
- Oracle : Read Committed
참고
'etc' 카테고리의 다른 글
[메시지 큐] Kafka, RabbitMQ 개념 및 비교 (1) | 2020.06.22 |
---|---|
[DB] NoSQL - 특징, 종류, 데이터 모델링 (0) | 2020.02.17 |
[디자인패턴] 싱글톤 패턴/Singleton Pattern (1) | 2020.02.14 |
[디자인패턴] 옵저버 패턴/Observer Pattern (0) | 2019.12.24 |
- Total
- Today
- Yesterday
- 정렬 알고리즘
- WinDbg
- LinearLayout
- 백준
- HTTP
- debug
- BOJ
- windows
- C++
- listview
- DATABASE
- Android
- 스프링부트
- 퀵정렬
- ConstraintLayout
- adapter
- 안드로이드
- 백준알고리즘
- C
- frameLayout
- 스프링
- 윈도우
- 알고리즘
- 네트워크
- 이진탐색트리
- handshake
- OS
- layout
- RelativeLayout
- 운영체제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |