티스토리 뷰

격리 수준이란, 트랜잭션이 동시에 여러개 발생했을 때, 특정 트랜잭션이 다른 트랜잭션의 변경사항을 볼 수 있게 할지 말지 결정하는 것이다.

크게 READ_UNCOMMITED, READ_COMMITED, REPEATABLE_READ, SERIALIZABLE 4가지가 있다.

 

1. READ_UNCOMMITED

각 트랜잭션의 변경 내용이 commit, rollback 여부에 관계없이 모두 보인다. (dirty read 발생)

사용하지 말자

2. READ_COMMITED

오라클 DBMS에서 기본으로 사용되는 격리 수준. 온라인 서비스에서 가장 많이 사용된다.

데이터 변경이 일어날 때 언두로그에 원본 데이터가 저장된다. 이 격리 수준에서는 COMMIT되기 전 데이터는 언두 로그에서 백업본을 읽기 때문에 COMMIT이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있다. COMMIT이후에서는 업데이트된 레코드를 읽을 수 있다.

같은 쿼리를 여러번 실행했을 때, 결과가 달라질 수 있다는 점에서 NON-REPEATABLE READ가 발생할 수 있다.

3. REPEATABLE_READ

MySQL InnoDB 스토리지 엔진에서 기본으로 사용되는 격리 수준.

언두 영역의 데이터를 읽는다는 점은 READ_COMMITED와 동일하지만 몇번째 버전까지 들어가냐는 것이 다름.

어떻게 되나? 기본적으로 COMMIT할 때 레코드에는 TRX-ID를 같이 기록한다. 어떤 트랜잭션이 레코드를 조회할 때, 조회하려는 레코드의 TX-ID가 해당 트랜잭션의 ID보다 크면 해당 트랜잭션 이후에 COMMIT된 레코드 라는 의미이므로, 언두로그에서 현재 TX-ID보다 작은 가장큰 TX-ID를 가진 레코드를 읽어온다.

그렇게 되면, 어떤 트랜잭션이 아주 길게 실행 되면 언두로그에는 같은 레코드의 여러 버전을 저장해 둬야하고, 성능이 느려지는 원인이 될 수 있다.

PHANTOM_READ는 발생한다.

언두로그의 레코드에는 락을 걸 수 없다. 따라서 어떤 쿼리가 레코드 락을 필요로 한다면, 언두로그에서는 쿼리 실행이 불가능하기 때문에 원본 레코드에서 실행해야하고 이 과정에서 쿼리 결과가 달라 질 수 있다. (예: SELECT ... FOR UPDATE)

InnoDB에서는 갭락과 넥스트 키 락 덕분에 REPEATABLE_READ에서도 PHANTOM_READ가 발생하지 않는다.

4. SERIALIZABLE

가장 엄격한 격리 수준. 그만큼 동시 처리도 매우 느리다. 굳이 쓸 필요 없음

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함