Transaction이란?
- DB의 상태를 변환시키는 하나의 논리적인 “작업 단위를 구성하는 연산들의 집합”이다.
- 트랜잭션은 항상 all or nothing 원칙을 만족해야 한다.
- 즉 완료를 하던가(commit) 다시 원래의 상태로 돌아가던가(rollback) 둘중 하나는 만족해야 한다.
- 절대 partially Done 형태로 끝나서는 안된다.

트랜잭션의 성질(ACID)
Atomicity(원자성) , All or Nothing
- 트랜잭션의 모든 연산들은 정상적으로 수행 완료되거나 아니면 전혀 어떠한 연산도 수행되지 않은 상태를 보장해야 한다.
Consistency(일관성)
- 트랜잭션 완료 후에도 데이터베이스가 일관된 상태로 유지되어야 한다.
- 예를 들어 계좌이체를 성공적으로 실행했다면 A계좌 잔액과 B계좌 잔액의 합이 트랜잭션 실행 전의 합과 동일해야 한다.
Isolation(독립성)
- 하나의 트랜잭션이 실행하는 도중에 변경한 데이터는 이 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못하도록 보장하여야 한다.
- DB는 클라이언트들이 같은 데이터를 공유하는 것이 목적이므로 여러 트랜잭션이 동시에 수행된다.
이 때 트랜잭션은 상호 간의 존재를 모르고 독립적으로 수행되어야 한다.
Durability(지속성)
- 시스템 장애가 회복되고 난 후에 어떠한 형태로든지 그 데이터를 복구 할 수 있어야 한다.
DB 데이터의 정합성을 어떻게 만족, 보장할 수 있을까?
- 멀티 트랜잭션 환경에서 DB의 일관성과 무결성을 유지하려면 트랜잭션의 순차적 진행을 보장할 수 있어야 한다.
- 이런 보장을 위해 LOCK(트랜잭션 처리의 순차성을 보장하기 위한 방법)을 사용한다.
- 크게 배타적 락(exclusive)과 공유 락(shared)이 있다.
베타(Exclusive) Lock
- 배타적 락은 쓰기 잠금(Write lock)이라고도 불린다.
- 어떤 트랜잭션에서 데이터를 변경하고자 할 때 해당 트랜잭션이 완료될 때까지 해당 테이블 혹은 레코드(row)를 다른 트랜잭션에서 읽거나 쓰지 못하게 하기 위해
Exclusive lock을 걸고 트랜잭션을 진행시키는 것이다.
공유(Shared) Lock
- 데이터를 읽을 때 사용되어지는 Lock으로 쓰는것이 잠긴다.
- 이런 공유 Lock은 공유 Lock 끼리는 동시에 접근이 가능하다.
- 즉, 하나의 데이터를 읽는 것은 여러 사용자가 동시에 할 수 있다.
블로킹(Blocking)
- 블로킹은 Lock간(베타 - 베타, 베타 - 공유)의 경합이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태를 말한다.
- 이러한 Lock의 범위가 넓어질수록 동시에 접근할 수 없는 자원이 많아지므로 동시성 비용이 높아져 효율이 떨어진다.
- 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료(커밋 OR 롤백)되어야 한다.
- 이런 경합은 성능에 좋지 않은 영향을 미치므로 경합을 최소화 할 필요가 있다.
- 한 트랜잭션의 길이를 너무 길게하는 것은 경합의 확률을 올린다.
- 처음부터 설계할 때 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 한다.
- 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않는다.
- 쿼리를 오랜시간 잡아두지 않도록 적절한 튜닝을 진행한다.

Comments