들어가며
모 기업 면접에서 대규모 트랜잭션 관리하는 코드를 짜보고 싶다고 이야기했다. 그랬더니 "Isolation"에 대해 아냐는 물음이 들어왔고, 아무말도 할 수 없었다. 나중에 찾아보니 ACID 이야기가 나와 대충 아는 내용이 기억은 났지만, 트랜잭션을 하고 싶다는 사람이 바로 답이 나오지 않은 것은 부끄러웠다. 그래서 공부하는 내용을 정리해보려고 한다.
1. 정의
트랜잭션이란 하나 또는 그 이상의 명령을 통해 데이터베이스의 상태를 변화시키는 단일 논리 단위를 말한다. 실제 비즈니스 로직에서 어떤 요구사항이 수행될 때는 한 번 이상 데이터베이스를 접근하게 되는데, 이 모든 접근을 하나로 묶어 트랜잭션이라 한다. 가령, 인터넷으로 사과를 주문하는 상황을 가정했을 때 수행할 수 있는 접근은 다음과 같다.
1. 사과의 재고 파악
2. 사과 주문 가능 여부 확인
3. 사과 재고 개수 줄이기
4. 물품 주문 내역 기록
위 네 단계를 묶어 하나의 트랜잭션이라고 한다.
2. 특징(ACID)
트랜잭션의 특징은 A(Atomicity), C(Consistency), I(Isolation), D(Duration) 네 가지로 나뉜다. 줄여서 ACID라고 한다. 하나씩 살펴보자.
1) 원자성(Atomicity)
트랜잭션의 독립에 관한 특성이다. 트랜잭션은 여러 작업(예시 - 사과 주문 트랜잭션)으로 구성되어 있는데, 이 작업들이 하나의 단일 결과를 내도록 해야 한다는 점이다. 만약, 트랜잭션 수행 도중 특정 작업에서 오류가 발생한 경우, 이전까지 수행되었던 작업 결과를 Commit 하지 않고 모두 Rollback 시킨다.(Rollback은 상태전이에서 다룰 예정이다.)
2) 일관성(Consistency)
트랜잭션이 수행되고 있는 시점에서 데이터베이스가 일관된 상태를 유지해야하는 특성을 의미한다. 원자성을 먼저 공부한 입장에서, 이런 질문이 들었다.
Q. 원자성이 보장되면 당연히 지속성은 보장되는 것이 아닌가?
A. 그렇지만은 않다. 동시성을 제어하지 않는 경우, 트랜잭션이 DB를 수정하는 시점에 다른 트랜잭션이 DB를 수정하는 경우가 생길 수 있다. 예를 들어, A와 B 두 명의 사용자가 사과 주문 트랜잭션을 수행한다고 가정하자. 현재 사과의 재고는 3개이며, A와 B 트랜잭션이 각각 2개의 사과를 동시에 주문하는 상황을 가정해보자.
1. A 트랜잭션 시작
2. A 트랜잭션 실행
3. B 트랜잭션 시작
4. B - 사과의 재고 파악 // A의 트랜잭션과 동시에 실행되었기 때문에, A의 수행 상태에 따라 DB에 현재 남은 사과의 개수가 다르게 표현될 가능성이 있다. => 일관성이 깨진다.
이런 경우를 대비하기 위해 동시성 제어 메커니즘을 사용할 수 있다. A 트랜잭션이 돌아가는 동안 다른 트랜잭션이 돌지 못하도록 lock을 거는 등의 방법이 있다. (나중에 공부 후 포스팅해야겠다.)
3. 격리성(Isolation)
각 트랜잭션이 다른 트랜잭션으로부터 독립된 정도를 의미하는 특성이다. 4단계로 격리 수준을 나누는데, 격리 수준이 높을 수록 다른 트랜잭션에 영향을 미치지 않는다.(나중에 자세히 공부 후 포스팅 예정)
4. 지속성(Duration)
트랜잭션이 성공적인 완료된 후에 디스크에 영구적으로 저장하여 데이터의 지속성을 유지하는 특성을 말한다. 커밋(Commit)을 한다고 표현한다.
Q. Commit이란?
A. 데이터를 디스크에 영구 보관하는 것을 의미한다.
데이터는 DB에 남아있지만, 디스크에 따로 저장을 한다. 이 과정에서, 매 트랜잭션마다 커밋이 일어나면 디스크 접근 자체가 느리기 때문에 병목이 발생한다. 이를 해결하기 위한 기법으로 Batch Processing 기법이 있다. 트랜잭션을 모아 일정 주기마다 한번에 저장하는 방식을 의미한다.
틀리거나 부족한 설명이 있다면 알려주세요 감사합니다~!
'Computer Science > 데이터베이스' 카테고리의 다른 글
[Mysql] DB 성능 최적화 - 1. Explain이란? (2) | 2025.01.20 |
---|---|
[Mysql] Upsert란? - 1 (Insert, Update 동시에 하기) (3) | 2024.12.26 |
[MariaDB] 데이터 타입 종류 정리해서 보자! (0) | 2023.07.28 |
[SQL, MariaDB] 한 테이블의 특정 컬럼에 있는 값이 다른 컬럼에 없는 레코드 탐색. (0) | 2023.03.14 |