트랜잭션의 특징(ACID)과 격리 레벨

이준석·2023년 8월 4일
0

Database

목록 보기
1/4

트랜잭션

트랜잭션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말하며 데이터베이스에 접근하는 방법은 쿼리이므로, 즉 여러 개의 쿼리들을 하나로 묶는 단위를 말한다. 이에 대한 특징은 원자성, 일관성, 독립성, 지속성이 있으며 이를 한꺼번에 ACID 특징이라고 한다.

하나의 트랜잭션에선 하나의 쓰레드만 동작한다.

원자성(Atomicity)

원자성은 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징이다.

일관성(Consistency)

일관성은 트랜잭션이 일어나기 전의 상황과 동일하게 ‘허용된 방식’으로만 데이터를 변경해야 하는 것을 의미한다.

격리성(Isolation)

격리성은 각각의 트랜잭션이 독립적으로 수행되어야 함을 의미한다.

격리 레벨

  1. SERIALIZABLE (Level 3)
    • 특정 트랜잭션에서 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제/삽입 모두 불가능하다.
    • 모든 이상 현상 방지가 가능하다.
    • 하지만 그만큼 동시성이 떨어져서 성능이 하락할 수 있다.
    • next-key lock 사용
  2. REPEATABLE_READ (Level 2)
    • 특정 트랜잭션에서 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제가 불가능하다.
    • 삽입(Insert)은 가능하다.
    • Phantom Read가 발생할 수 있다.
    • MySQL의 Default값이다.
    • 한 행 읽기에 대해서는 index record lock.
    • 여러 행에 대해선 gap lock 또는 next-key lock 사용
  3. READ_COMMITTED (Level 1)
    • 트랜잭션 수행이 완료되고 commit 된 데이터만 다른 트랜잭션에서 Read하도록 허용한다.
    • Non Repeatable Read, Phantom Read가 발생할 수 있다.
    • 보통 DBMS들의 Default값이다.(ex. ORACLE)
  4. READ_UNCOMMITTED (Level 0)
    • 트랜잭션 수행 중이거나 아직 commit 되지 않은 데이터를 다른 트랜잭션에서 Read 하는 것을 허용한다.
    • Dirty Read, Non Repeatable Read, Phantom Read가 발생할 수 있다.

격리 레벨에 따라 발생하는 현상

  1. 팬텀 리드(phantom read)

한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 다른 트랜잭션에서 해당 gap에 새로운 row를 insert하여 다른 조회 결과가 나오는 경우.

  1. 반복 가능하지 않은 조회(non-repeatable read)

한 트랜잭션 내 동일한 쿼리를 보냈을 때 다른 트랜잭션에서 해당 쿼리 결과(rows or a row)에 대해 데이터를 업데이트하여 다른 조회 결과가 나오는 경우.

  1. 더티 리드(dirty read)

반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수행되었지만 아직 커밋되지 않은 행의 데이터를 읽을 수 있을 때 발생한다.

지속성(Durability)

지속성은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미한다.

이는 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 의미하며, 데이터베이스는 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공한다.

profile
천천히 꾸준히

0개의 댓글

관련 채용 정보