❒ Description
트랜잭션은 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
오늘은 DB 면접 단골 질문인 트랜잭션에 대해서 기초와 깊이 있는 학습을 해보자!!
❒ ACID
ACID는 트랜잭션의 핵심이다. Atomicity, Consistency, Isolation, Durability의 첫 글자를 따온 것으로
각 단어는 트랜잭션이 어떤 속성을 지녀야 하는지 나타낸다.
1. 원자성 (Atomicity)
원자성은 트랜잭션과 관련되 일이 모두 수행되었거나 되지 않았거나를 보장하는 것이다. 예를 들어 트랜잭션을
커밋했는데, 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것을 말한다.
원자성을 지키기 위해 DB에서는 commit과 rollback이 있다.
commit은 실행 시 DB에 영구적으로 데이터를 저장하고, rollback은 실행 시 이전 상태로 되돌린다.
2. 일관성 (Consistency)
일관성은 허용된 방식으로만 데이터를 변경해야 하는 것을 의미한다. 예를 들어 내 통장 잔고가 5000원인데
친구에게 10000원을 송금해줄 수 있을까? 그렇지 않다. 만약 송금이 가능하다면 내 통장 잔고는 -5000원이
된다. 그 어떤 데이터베이스도 잔고가 0원 미만을 허용하지 않을 것이다.
이처럼 트랜잭션은 DB 상태를 consistent 상태에서 또 다른 consistent 상태로 바꿔줘야 한다.
constraints, trigger 등을 통해 DB에 정의된 규칙들을 위반했다면 rollback 되어야 한다.
그리고 위반 여부는 DBMS가 commit 전에 확인하고 알려준다. 그 외에 application 관점에서 transaction이
consistent하게 동작하는지는 개발자가 챙겨야 한다.
3. 격리성 (Isolation)
격리성은 여러 트랜잭션이 동시에 실행될 때도 혼자 실행하는 것처럼 동작하게 만드는 것을 말한다.
DBMS는 여러 종류의 isolation level은 제공해준다. 따라서 개발자는 어떤 level로 트랜잭션을 동작시킬지
상황에 맞게 판단하여 설정해주면 된다. 그리고 isolcation은 concurrency control의 주된 목표이도 한다.
4. 지속성 (Durability)
영존성이라고도 부르는 지속성은 성공적으로 수행된 트랜잭션, 즉 커밋된 트랜잭션은 지속(영구)적으로 DB에
저장되어야 하는 것을 의미한다. `여기서 영구적으로 저장한다`라고 할 때는 일반적으로 메모리 계층 중에서
보조기억 장치에 저장함을 의미한다. 기본적으로 트랜잭션의 Durability는 DBMS에서 보장한다.
❒ Concurrency Control : schedule & serailizability
1. Schedule의 개념
schedule이란 시간 순서대로 진행해야 할 작업을 나열하는 개념이다. 이는 DB에서도 적용된다.
위 그림은 트랜잭션 과정을 도식화 한 것인데 여기서 read(~), write(~) 이런 것들을 operation이라고 한다.
이 operation은 아래와 같이 간소화 할 수 있다.
r1(G) w1(G) r1(C) r2(C) w2(C) C2 w1(C) C1
r : 수행하는 작업
1 : TX번호
(G): 접근하는 데이터
결국 여러 트랜잭션들이 동시에 실행될 때 각 트랜잭션에 속한 operation들의 실행 순서를 Schedule이라고 한다.
이 트랜잭션들 내의 operation들의 순서는 절대 바뀌지 않는다.
그리고 schedule에는 다음과 같이 2가지 종류가 있다.
‣ Serial Schedule
Serial Schedule은 한 번에 하나의 tx만 실행되기 때문에 좋은 성능을 낼 수 없고,
현실적으로 사용할 수 없는 방법이다.
‣ Nonserial Schedule
Nonserial schedule은 tx가 겹쳐서 실행되기 때문에 동시성이 높아져서 같은 시간동안
더 많은 tx를 처리할 수 있다. 하지만 Nonserial schedule은 tx들이 어떤 형태로 겹쳐서
실행되는지에 따라 이상한 결과가 나올 수 있다.
여기서 새로운 고민이 등장하는데 nonserial schedule로 실행해도 이상한 결과가 나오지 않을 수 있는 방법에 대한
고민을 하게 된다. 그 고민의 결과로 "serial schedule과 동일한(equivalent) nonserial schedule을 실행하자!"
라는 아이디어가 나오게 되는데 그렇다면 여기서 schedule이 동일하다의 의미는 무엇일까? 이걸 이해하기 위해
Conflict와 이에 연관된 정의를 이해해야 한다.
2. Conflict의 개념
Conflict는 서로 다른 두 개의 operation이 아래의 세 가지 조건을 모두 만족하면 성립한다.
- 서로 다른 transaction 소속
- 같은 데이터에 접근
- 최소 하나는 write opertaion
이 Conflict 개념은 conflict operation의 순서가 바뀌면 결과도 바뀌기 때문에 굉장히 중요한 개념이다.
위 그림에서는 `r1(C) & w2(C)` 와 `r2(C) & w1(C)` 모두 세 가지 조건을 충족하기 때문에 Conflict 하다.
이제 이 Conflict 개념으로 Conflict equivalent라는 개념을 정의 할 수 있다.
Conflict equivalent는 서로 다른 두 개의 operation이 아래의 두 가지 조건을 모두 만족하면 성립한다.
- 두 schedule은 같은 transaction들을 가진다.
- 어떠한 conflicting operations의 순서도 양쪽 schedule 모두 동일하다.
위 그림에서 non-serial인 Schedule1 입장에서는 serial인 Schedule2와 Conflict equivalent 한 것을 알 수 있다.
이는 곧, "non-serial schedule이 serial schedule과 Conflict equivalent 한 때를 Conflict serializable하다."
라고 정의할 수 있다.
이렇게 Conflict serializable한 nonserial schedule을 허용하면 여러 트랜잭션들이 겹쳐서 실행되어도 이상한
결과가 나오지 않음을 보장한다. 하지만 이 해결책은 모든 tx에 대해 매번 conflict-serializable 한지 확인해야 하기
때문에 그 비용이 비싸다는 이슈가 있다.
그래서 오늘날에는 애초에 conflict-serializable한 schedule만 실행하도록 하는 프로토콜을 적용한다.
3. Concurrency Control
Concurrency Control은 어떠한 schedule도 serializable 하게 동작해주는 것을 보장하는 역할을 한다.
그래서 이것과 밀접하게 연관된 속성이 바로 ACID 중 I에 해당하는 Isolation 속성이다.
정확하게 말하자면, Concurrency Control은 여러 트랜잭션이 동시에 실행될 때 데이터의 일관성을 유지하고
충돌을 방지하기 위한 방법론이고, Isolation은 트랜잭션 간의 간섭을 최소화하여 각 트랜잭션이 독립적으로
실행되는 것처럼 보이게 하는 성질을 의미한다.
따라서, Concurrency Control은 트랜잭션이 동시에 실행될 때 발생할 수 있는 여러 문제를 해결하면서,
Isolation 수준을 보장하는 데 중요한 역할을 합니다.
만약 Concurrency control을 너무 완벽하게 추구하면 그만큼 동시성이 떨어지게 된다. 그래서 이 Isolation을
개발자들이 필요에 따라 유연하게 선택할 수 있는 옵션이 주어지는데 그것이 바로 isolation level이다.
❒ 정리
이번 포스팅에서는 데이터베이스 트랜잭션의 중요한 성질인 ACID를 정리했으며, 그 중 Isolation 속성을
보장하기 위한 개념인 Concurrency control에 대해서 이해하기 위한 몇 가지 기본 개념을 익혔다.
공부한 내용을 정리해보자면 어떠한 schedule A가, 임의의 schdule B와 equivalent 하면
A는 serializable 하며, serializability 속성을 갖는다.
라고 정의할 수 있다. 여기서 equivalent의 의미를 conflict-equivalent를 통해 정의했기 때문에,
A는 conflict-serializable 하며, conflict-serializability 속성을 갖는다.
라고도 정의할 수 있다.
그리고 Concurrency Control이란, 어떤 schedule도 serialzable 하게 또는 serializability를 갖도록
보장하는 역할을 하며, Isolation 속성과 밀접한 관련이 있는 개념이다.
'CS > Database' 카테고리의 다른 글
Lock을 활용한 concurrency control (0) | 2024.10.02 |
---|---|
Isolation 레벨과 이상 현상들 (0) | 2024.09.26 |
DB Transaction & Concurreny Control (2) (0) | 2024.09.20 |
B-tree와 DB 인덱스(index) (0) | 2024.09.01 |
FD & Normalization (0) | 2024.09.01 |