Skip to content

1조 240821 트랜잭션 학습

June edited this page Aug 21, 2024 · 2 revisions

트랜잭션 격리 수준

READ UNCOMMITTED

  • 더티 리드 허용
  • 변경 사항이 InnoDB버퍼 풀에 저장되는데 이걸 직접 접근한다.

READ COMMITTED

  • 버퍼 풀에 저장된 데이터에 접근하지 않고, commit된 데이터에만 접근
  • 더티 리드는 발생하지 않음

REPEATABLE READ

  • 하나의 트랜잭션 내에서 동일한 읽기 결과를 보장. 즉, 하나의 트랜잭션 내에서 반복가능한 읽기가 가능하다는 의미이다.

  • Repeatable read는 트랜젝션의 새로운 레코드의 추가를 막지 않기 때문에 최초 SELECT .. FOR UPDATE를 호출한 뒤에도 새로운 레코드가 생성/삭제될 수 있다. 따라서 같은 트랜젝션 내에서 SELECT ... FOR UPDATE가 호출되는 시점에 따라 일관되지 않은 레코드가 조회될 수 있다.

    # tx-1 start
    SELECT * FROM xxx; # result set: 1건, (1시 1분 1초)
    SELECT * FROM xxx FOR UPDATE; # result set: 2건, (1시 1분 5초)
    # tx-2 commit
    
    # tx-2 start
    INSERT INTO xxx; # (1시 1분 2초 )
    # tx-2 commit

SERIALIZABLE

  • 실제로 순차적으로 실행되는 것이 아닌 순차적으로 실행되는 것과 결과가 동일하도록 구현한 것



MVCC (Multi-Version Concurrency Control)

만약 두 가지 버전의 데이터가 존재하는 상황에서 새로운 사용자가 데이터에 접근하면 데이터베이스의 Snapshot을 읽는다. 그러다가 변경이 취소되면 원본 Snapshot을 바탕으로 데이터를 복구하고, 만약 변경이 완료되면 최종적으로 디스크에 반영하는 방식으로 동작한다.

InnoDB 버퍼풀

  • 데이터의 값을 변경할 때, 변경한 데이터를 저장한다.
  • 변경한 데이터는 MySQL 백그라운드 스레드에 의해 특정 시점에 디스크에 반영한다.

Undo Log

  • 트랜잭션이 실행되는 시점에 변경전 데이터를 백업해둔 로그이다.
  • 트랜잭션의 격리 수준을 보장하기 위해 사용된다.
    • 트랜잭션 보장 : 트랜잭션이 롤백되면 undo 로그에 백업된 데이터로 복원한다.
    • 격리수준 보장 : 특정 트랜잭션에서 데이터를 변경하는 도중에, 다른 트랜잭션에서 데이터를 조회하는 상황에서 격리수준에 맞는 데이터를 반환할 수 있다.
  • 시스템 장애가 발생했을 경우, undo 로그를 보며 롤백시킨다.

Redo Log

  • 변경 후 데이터: 시스템 복구 또는 성능 향상

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally