ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Database]트랜잭션 격리 수준 - Transaction isolation level
    Development 2020. 1. 13. 22:52

    Transaction isolation level

    1. 트랜잭션 격리 수준
    2. 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정
    3. 격리 수준 : Read Uncommitted, Read Committed, Repeatable Read, Serializable
    4. 격리 수준이 높아질수록 동시성도 떨어지는 것이 일반적이라고 볼 수 있다.

    Isolation 정의

    여러 트랜잭션이 시작 시점은 다르나 동시(concurrent)에 수행된 결과는 각각의 트랜잭션이 순서대로 나온 결과와 같음을 보장하는 속성

    Isolation Level

    Isolation Level Dirty Read Non-Repeatable Read Phantom Read
    Read uncommitted O O O
    Read committed X O O
    Repeatable Read X X O
    Serializable X X X

    Read Uncommitted (Dirty Read)

    • 일반적으로 거의 사용하지 않음
    • 변경 내용이 Commit이나 Rollback 여부에 상관없이 다른 트랜잭션에서 보여짐
    • 어떤 트랜잭션에서 처리한 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상
    • Dirty Read를 유발하는 Read Uncommitted는 RDBMS 표준에서는 트랜잭션의 격리 수준으로 인정하지 않을 정도로 정합성에 문제가 많은 격리 수준
    • Dirty Read, Non-repeatable read, Phantom read 현상 발생

    Read Committed

    • Oracle DBMS에서 기본적으로 사용되고 있는 격리 수준
    • Commit된 내용만 읽을 수 있다.
    • 트랜잭션이 다르더라도 타 트랜잭션이 commit하면 해당 데이터를 read할 수 있다.
    • Read committed 격리 수준에서도 Non-repeatable read라는 부정합 문제 발생

    Repeatable Read

    • select시 현재 버전의 snapshot을 만들고 그 snapshot으로부터 데이터를 조회한다.
    • 동일 트랜잭션 내에서 일관성을 보장하지만 데이터를 다시 읽어들이기 위해서는 트랜잭션을 다시 시작해야 한다.
    • Dirty Read와 Non-repeatable read가 발생하지 않고 Phantom read만 발생한다.
    • MySQL은 Phantom read를 막기 위하여 record lock과 gap lock을 걸어 next-key lock을 구현한다.
      • record lock : 현재 record에 대한 lock
      • gap lock : 해당 primary key와 이전 primary key 사이에 데이터를 넣을 수 없다.
    • Oracle은 SELECT ~ FOR UPDATE로 구현. DB2, SQLServer는 read lock을 commit 할 때까지 유지하는 방식으로 구현

    Serializable

    • 동시성이 중요한 DB에서는 거의 사용하지 않는다.
    • 읽기 작업도 공유 잠금을 획득해야하만 하며, 동시에 다른 트랜잭션은 그러한 레코드를 변경하지 못하게 된다.
    • 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없다.
    • 일반적으로 DBMS에서 일어나는 Phantom read 라는 문제가 발생하지 않지만 InnoDB 스토리지 엔진에서는 repeatable read 격리 수준에서도 이미 Phantom read가 발생하지 않으므로 굳이 Serializable를 사용할 필요가 없다.

    'Development' 카테고리의 다른 글

    [CNCF] Vitess?  (0) 2020.07.18
    소프트웨어 개발 주기와 애자일  (0) 2019.10.26

    댓글

2017 TIFY Team All Rights Reserved.