1. 격리 수준이란

    1. 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정
    2. 격리 수준의 구분
      1. READ UNCOMMITED
      2. READ COMMITED
      3. REPEATABLE READ
      4. SERIALIZABLE
    3. 구분에서 READ_UNCOMIMITED는 일반적으로 사용되지 않고, SERIALIZABLE 또한 동시성이 중요한 DB에서는 사용되지 않음
    4. 격리수준은 올라갈수록 고립성이 높아지고, 동시처리성을 낮아진다고 생각하는데 SERIALIZABLE아니면 성능의 개선이나 저하는 발생하지 않음
    5. 보통은 READ COMMITED, REPEATABLE READ가 사용되며, 오라클의 경우 READ COMMITED, MySQL의 경우 REPEATABLE READ가 기본적으로 사용됨
  2. READ UNCOMMITED

    Untitled

    1. 각 트랜잭션에서 변경 내용이 COMMIT이나 ROLLBACK여부와 상관없이 다른 트랜잭션에서 사용이 가능한 수준
    2. 위 경우에서의 문제는 (222, Busan) 레코드가 commit되지 않고 rollback처리가 되더라도 transaction2에서는 조회가되서 사용될 수 있다는 점
    3. 위와 같은 현상을 더티 리드라고 하며 더티 리드가 허용되는 수준이 READ UNCOMMITED수준
  3. READ COMMITED

    Untitled

    1. 오라클에서 기본적으로 사용되는 격리 수준이며, 온라인 서비스에서 가장 많이 선택되는 격리 수준
    2. 이 레벨에서는 더티 리드는 발생하지 않음, 이름에서처럼 commit된 정보만 읽을 수 있기 때문
    3. 위 과정에서 UPDATE를 진행할 때 언두 영역에 기존의 레코드를 복사해두게 되고, COMMIT되지 않은 상태이기 때문에 transaction2는 언두 영역의 백업된 레코드를 조회하게 됨
    4. READ COMMITED수준은 커밋되기 전까지는 다른 트랜잭션에서 변경 내역을 조회할 수 없음
    5. 하지만 READ COMMITED에서는 NON REPEATABLE READ라는 부정합의 문제가 발생함
    6. 하나의 트랜잭션에서 이미지의 SELECT FROM 222가 2번 실행되는 동안 다른 사용자가 COMMIT을 하게 되면 2번째 SELECT에서는 조회가 되는 문제가 발생하게 됨
    7. 이러한 문제가 SELECT를 실행할 때 항상 같은 결과를 가져와야하는 REPEATABLE READ 정합성에 어긋남
  4. REPEATABLE_READ

    Untitled

    1. MySQL에서 InnoDB 스토리지 엔진에서 기본으로 사용되는 격리 수준(바이너리 로그를 가진 MySQL에서는 최소 REPEATABLE READ를 사용해야함)

    2. InnoDB 스토리지 엔진은 트랜잭션이 ROLLBACK될 가능성에 대비해 변경되기 전 레코드를 언두 공간에 백업해두고 실제 레코드 값을 변경함(이런 변경 방식을 MVCC 라고함)

    3. 위 이미지에서 transaction2는 transaction id 10을 가지고 수행하므로 transaction id 10보다 이전인 트랜잭션에 대해서만 읽어올 수 있는 구조

    4. 트랜잭션 아이디는 지속적으로 증가하는 방식으로 구성됨

    5. 하지만 REPEATABLE_READ에서는 PHANTOM READ문제가 발생(다른 트랜잭션에 의해 처리된 작업에 의해 레코드가 보였다가 안보였다 하는 현상)

      Untitled

  5. SERIALIZABLE

    1. 가장 단순한 격리 수준이면서 가장 엄격한 격리 레벨
    2. 동시 처리 성능은 격리 레벨중 가장 떨어짐
    3. InnoDB 테이블에서 순수한 SELECT작업(INSERT … SELECT 등을 제외)은 아무런 레코드 잠금도 없이 수행됨
    4. InnoDB 매뉴얼에서 자주 나타나는 Non-locking consistent read(잠금이 필요 없는 일관된 읽기)라는 말이 이를 의미
    5. SERIALIZABLE 수준에서는 읽기 작업도 잠금을 획득해야하며, 동시에 다른 트랜잭션은 그러한 레코드를 변경하지 못하게 됨
    6. 즉, 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 읽고 쓰지 못하도록 하는 수준
    7. 이를 통해 PHANTOM READ 문제가 발생하지 않도록 가능
    8. 하지만 InnoDB 스토리지 엔진의 갭 락과 넥스트 키 락 덕분에 REPEATABLE READ 수준에서도 PHANTOM READ가 발생하지 않음