DB 트랜잭션의 정의와 격리수준

Jay·2023년 8월 17일
0

트랜잭션의 정의

트랜잭션이란 여러 데이터베이스 작업을 하나의 작업 집합으로 처리하는 것으로 모든 작업이 완벽하게 처리되거나, 일부가 처리에 실패할 경우 모든 작업을 복구하는 기능이다.

트랜잭션의 상태

ACTIVE: 트랜잭션이 실행중인 상태
COMMIT: 트랜잭션을 구성하는 모든 작업들이 올바르게 처리되어 DB에 영구적으로 반영된다.
ROLLBACK: 트랜잭션 실행 도중 문제가 발생해 실행된 모든 작업을 트랜잭션 실행 이전으로 되돌리는 상태.

트랜잭션의 특징(ACID)

트랜잭션의 특징은 크게 4가지로 앞 글자를 따서 ACID라고 부른다.
1. Atomicity(원자성): 트랜잭션을 구성하는 모든 작업을 하나의 원자 처럼 취급한다. 모든 작업은 결국 Commit되어 DB에 반영되거나, Rollback되어 작업이 하나도 반영되지 않는 경우만 존재해야 한다.
2. Consistency(일관성):
3. Isolation(고립성): 트랜잭션은 독립적으로 실행되어야 하며, 트랜잭션이 실행중일 때 다른 트랜잭션은 영향을 미칠 수 없다.
4. Durability(영속성, 지속성): 트랜잭션이 COMMIT되면 데이터베이스에 트랜잭션의 결과가 영구적으로 남아야 한다.

트랜잭션의 격리 수준(Isolation Level)

다수의 트랜잭션이 동시에 실행되고 있을 때 트랜잭션간 작업 내용을 얼마나 공유할 것인지 결정하는 수준이다.

  • Read Uncommitted
    커밋되지 않은 데이터도 다른 트랜잭션에서 읽을 수 있다. Dirty Read 현상이 발생할 수도 있는데, Dirty Read란 아직 처리가 완료되지 않은 트랜잭션의 결과를 다른 트랜잭션에서 볼 수 있는 현상이다. 그래서 트랜잭션이 RollBack됐을 때 다른 트랜잭션에서는 정확하지 않은 데이터를 얻을 수도 있어 데이터 정합성 측면에서 문제가 있어 권장되지 않는다.

  • Read Committed
    Oracle DB의 기본 격리수준. 트랜잭션으로 인한 변경사항을 테이블에 반영하기 전에 언두(Undo)라는 별도의 영역에 기존의 데이터를 백업하고 테이블에 변경사항을 저장하는 방식이다. 그래서 트랜잭션으로 데이터가 변경되어도 커밋 전이라면 다른 트랜잭션은 언두 영역에서 기존의 데이터를 조회하게 된다. Non Repeatable Read 현상은 반복해서 조회 쿼리를 실행할 때 항상 같은 값을 조회하지 못하는 현상이다.

    ① A 트랜잭션 시작
    ② A 트랜잭션에서 user id = 5인 레코드를 조회한다.
    ③ B 트랜잭션 시작
    ④ B 트랜잭션에서 user id = 5인 레코드를 업데이트 한다.
    ⑥ B 트랜잭션 커밋
    ⑦ A 트랜잭션에서 다시 user id = 5인 레코드를 조회한다.
    -> 2번 쿼리와 다른 결과를 얻게된다. (🔥 Non Repeatable Read 발생)

  • Repeatable Read
    MySQL InnoDB 엔진의 기본 격리수준. 데이터 변경시 원 데이터를 언두 영역에 저장한다는 점은 Read Committed와 동일하다. 모든 트랜잭션은 순차적으로 증가하는 트랜잭션 고유의 번호가 부여되는데 Repeatable Read 수준은 언두영역에서 데이터를 조회할 때, 자신의 트랜잭션 보다 작은 트랜잭션 번호를 가진 것을 조회한다.
    Phantom Read란 다른 트랜잭션의 변경작업으로 인해 조회 결과가 다른 현상이다. SELECT ~ FOR UPDATE 쿼리를 실행할 때 잠금을 걸어야 하는데, 언두 레코드에는 잠금을 걸 수 없기 때문에 현재 레코드를 조회해 발생하는 현상이다.

  • Serializable
    Serializable 수준에서는 읽기 작업도 잠금을 획득해야 해서 다른 트랜잭션에서 접근하고 있는 데이터는 다른 트랜잭션에서는 절대 접근할 수 없다. 하나의 데이터에는 한번에 하나의 트랜잭션만 접근할 수 있다.

profile
You're not a computer, you're a tiny stone in a beautiful mosaic

1개의 댓글

comment-user-thumbnail
2023년 8월 17일

훌륭한 글 감사드립니다.

답글 달기