트랜잭션은 이곳을 참고하면 편하다.
격리수준이라는 것은 동시에 여러 트랜잭션이 일어날때 얼마나 서로 고립되어 있는지를 나타내는 것이다. 간단하게 정리하자면 특정 트랜잭션이 다른 트랜잭션에 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것이다.
격리 수준은 아래와 같이 4가지로 분류한다.
먼저 위에 순서대로 격리 수준이 가장 낮고 맨 아래가 가장 격리 수준이 높다. 격리 수준이 높아질 수록 MySQL서버의 처리 성능이 많이 떨어질 것이라 생각할 수 있지만 사실상 그렇지는 않다. 맨 아래 직렬화 가능 기능만 아니라면 크게 성능의 개선이나 저하는 일어나지 않는다.
트랜잭션 수준 읽기 일관성.
트랜잭션이 시작된 시점으로부터 일관성 있게 데이터를 읽어 들이는 것을 말한다.
하나의 트랜잭션이 진행되는 동안 다른 트랜잭션에의해 변경사항이 발생하더라도 이를 무시하고 계속 일관성 있는 데이터를 보여준다. (물론 트랜잭션 자신이 발생한 변경사항은 읽을 수 있다)
트랜잭션에서 처리 중인 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
Dirty Read, Non-Repeatable Read, Phantom Read 현상이 발생한다.
데이터 정합성에 문제가 있다. RDBMS 표준에서는 격리수준으로 인정하지 않는다.
RDB에서 대부분 기본적으로 사용되고 있는 격리 수준으로 실제 테이블 값을 가져오는 것이 아니라 Undo 영역에 백업된 레코드 에서 값을 가져온다.
- Dirty Read가 발생하지는 않는다. 하지만 Non-Repeatable Read, Phantom Read 현상은 여전히 발생한다.
- 온라인 서비스에서 가장 많이 선택되는 격리 수준이다.
트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리수준이다.
Dirty Read와 같은 현상은 발생하지 않지만 Phantom Read 현상은 여전히 발생한다.
하나의 트랜잭션 실행시간이 길어질수록 Undo에 백업된 레코드가 많아져서 멀티 버전을 관리해야하는 단점이 있다.
선행 트랜잭션이 특정 테이블을 읽는 경우(SELECT) 공유 잠금(shared lock) 을 걸어, 다른 트랜잭션에서 해당 테이블의 데이터를 UPDATE, DELETE, INSERT 작업을 못하도록 막는다.
가장 단순한 격리 수준이지만 가장 엄격한 격리 수준으로
Phantom Read가 발생하지 않는다.
동시 처리 능력이 다른 격리수준보다 떨어지고 성능저하가 발생하여 데이터베이스에서 거의 사용되지 않는다.