개요
- 트랜잭션의 고립성에 대한 격리수준을 알아보고, 이해 할 수 있습니다
- MySQL의 InnoDB기준으로 설명됩니다
- 너무 긴내용들은 생략했습니다, 자세한 내용이 궁금하시다면 참조블로그를 가주시면 감사하겠습니다
트랜잭션의 격리 수준
- 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것
- 트랜잭션의 격리수준은 고립수준이 높은 순서대로
- SERIALIZABLE (1)
- REPEATABLE READ (2)
- READ COMMITTED (3)
- READ UNCOMMITED (4)
- 가 존재한다
SERIALIZABLE
- 가장 엄격한 격리수준을 가지고 있다
- 여러 트랜잭션이 동일한 레코드에 동시 접근할 수 없으므로, 어떠한 데이터 부정합 문제도 발생하지 않는다
- 하지만 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리성능이 매우 떨어진다
- 동일한 데이터에 접근할때 직렬적으로 처리된다는 뜻이고, 다른 데이터들에 대해서는 여전히 병렬적으로 처리된다
- 동일한 데이터에 대한 작업은 충돌 방지를 위해 차단되며, 대기 상태로 들어가거나 롤백될 수 있다
REPEATABLE RAED
- 일반적인 RDBMS는 변경전의 레코드를 언두 공간(Undo log)에 백업해둔다
- 그러면 변경 전/후 데이터가 모두 존재하므로, 동일한 레코드에 대해 여러버젼의 데이터가 존재한다고 하여 이를 MVCC(다중 버젼 동시성 제어)라고 부른다
- MVCC를 통해 롤백된 경우의 데이터를 복원할 수 있고, 서로 다른 트랜잭션간에 접근 할 수 있는 데이터의 세밀한 제어가 가능하다
- 각각의 트랜잭션은 순차 증가하는 고유한 트랜잭션 번호가 존재하며, 백업 레코드에는 어느 트랜잭션에 의해 백업되었는지 트랜잭션 번호를 함께 저장한다
- 그리고 해당 데이터가 불필요해진다고 판단하는 시점에 주기적으로 백그라운드 쓰레드를 통해 삭제한다
- REPEATABLE READ는 MVCC를 이용하여, 한 트랜잭션 내에서 동일한 결과를 보장하지만, 새로운 레코드가 추가되는 경우 부정합이 생길 수 있다
READ COMMITTED
- 커밋된 데이터만 조회할 수 있다
- REPEATABLE RAED의 경우 데이터가 수정되고 커밋되어도, 일관된 읽기를 통해 undo log를 통해 데이터를 가져오지만
- READ COMMITTED는 데이터가 수정되고 커밋되면, 비일관된 읽기를 통해 현재 데이터를 반환한다
- 이러한 특성덕분에 Non-Repeatable Read 문제가 발생할 수 있다
READ UNCOMMITTED
- 커밋하지 않은 데이터조차 접근할 수 있는 결리 수준
- 아무래도 이러한 점 때문에, 어떤 트랜잭션의 작업이 완료되지 않았는데 다른 트랜잭션에서 볼 수 있는 부정합 문제(Dirty Read)현상이 발생 할 수 있다
정리
- 예시를 들어 설명해보자
- A트랜잭션 (id=10)이 존재하고 먼저 시작됨
- B트랜잭션 (id=12)가 존재하고 후에 시작됨
SERIALIZABLE
- A트랜잭션이 Q라는 데이터에 대해 읽기 작업 시도 시 쉐어락이 설정됨
- B트랜잭션이 Q라는 데이터에 대해 읽기 작업 시도 가능 (쉐어락 획득시)
- A트랜잭션이 Q라는 데이터에 대해 쓰기 작업 시도 시 비관적락이 설정됨
- B트랜잭션이 Q라는 데이터에 대해 쓰기 작업 시도시, A트랜잭션의 쓰기작업 종료 이후 가능
REPEATABLE READ
- A트랜잭션이 Q라는 데이터에 대해 읽기 작업 시도 중
- B트랜잭션이 Q라는 데이터에 대해 읽기 작업 시도시, MVCC를 통해 undo log의 데이터 반환
- 이후 B트랜잭션이 Q라는 데이터에 대해 쓰기 작업후 (커밋 종료후), A트랜잭션이 Q라는 데이터 다시 조회시 동일하게 undo log의 데이터 반환
- A트랜잭션이 Q라는 데이터에 대해 쓰기 작업 시도 시 비관적락이 설정됨
- B트랜잭션이 Q라는 데이터에 대해 쓰기 작업 시도시, A트랜잭션의 쓰기작업 종료 이후 가능
READ COMMITTED
- A트랜잭션이 Q라는 데이터에 대해 읽기 작업 시도 중
- B트랜잭션이 Q라는 데이터에 대해 읽기 작업 시도시, MVCC를 통해 undo log의 데이터 반환
- 이후 B트랜잭션이 Q라는 데이터에 대해 쓰기 작업후 (커밋 종료후), A트랜잭션이 Q라는 데이터 다시 조회시 B트랜잭션의 쓰기 작업후의 데이터 조회
- A트랜잭션이 Q라는 데이터에 대해 쓰기 작업 시도 시 비관적락이 설정됨
- B트랜잭션이 Q라는 데이터에 대해 쓰기 작업 시도시, A트랜잭션의 쓰기작업 종료 이후 가능
READ UNCOMMITED
- A트랜잭션이 Q라는 데이터에 대해 읽기 작업 시도 중
- B트랜잭션이 Q라는 데이터에 대해 읽기 작업 시도시, 현재 Q의 데이터 반환
- A트랜잭션이 Q라는 데이터에 대해 쓰기 작업 시도 시 비관적락이 설정됨
- B트랜잭션이 Q라는 데이터에 대해 쓰기 작업 시도시, A트랜잭션의 쓰기작업 종료 이후 가능
참조 블로그
https://mangkyu.tistory.com/299