제육's 휘발성 코딩
반응형

트랜잭션 격리 수준

트랜잭션의 4원칙인 ACID에서 I인 격리성은 트랜잭션 수행 시 서로 동기화 보장을 의미한다. 즉, 트랜잭션의 병렬성에서 서로 격리되어 마치 순차적으로 실행되는 것처럼 동작해야되는 것을 의미한다.

트랜잭션 격리 수준은 다음과 같이 4가지로 나뉜다.

아래로 내려갈 수록 성능이 낮아지고, 격리 수준이 높아진다. (즉, 성능이 나빠지는 만큼 격리성이 높아진다.)

  • READ UNCOMMITTED (커밋되지 않은 읽기)
  • READ COMMITTED (커밋된 읽기)
  • REPEATABLE READ (반복 가능한 읽기)
  • SERIALIZABLE (직렬화 기능)

트랜잭션에 관한 이론은 https://sasca37.tistory.com/204 를 참고하자.

 

격리 수준

 

READ_UNCOMMITTED

가장 낮은 격리 수준으로 커밋되기 이전의 트랜잭션도 조회가 가능하도록 허용하는 격리 수준이다. 성능은 가장 빠르지만 무결성의 문제가 발생할 수 있다.

image

  • Dirty Read, Non-Reapeatable Read, Phantom Read 현상이 발생한다.

 

READ_COMMITTED

MySQL, PostgreSQL 등 데이터베이스에서 가장 많이 사용되는 격리 수준으로 보통 기본 값을 설정되어 있다. 이름 그대로 커밋된 정보만 조회를 허용하는 격리 수준이다. (참고로 그림의 UNDO는 Oracle에서 Lock 대신 제공해주는 기능이다.)

image

  • Non-Reapeatable Read, Phantom Read 현상이 발생한다.

 

REPEATABLE_READ

하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만, 새로운 행을 추가하는 것을 막지 않는 격리 수준이다.

image

  • Phantom Read 현상이 발생한다.

SERIALIZABLE

트랜잭션을 직렬화하는 것을 의미한다. 즉 매우 엄격한 수준으로 트랜잭션을 격리 시켜서 동기화 문제를 해결하지만, 모든 트랜잭션들이 작업 대기를 해야하므로 교착상태가 자주 발생하고 성능이 떨어지는 격리 수준이다.

 

격리 수준에 따라 발생하는 현상

image

격리 수준에 따라 팬텀 리드, 반복 가능하지 않은 조회, 더티 리드 등이 있다.

 

팬텀 리드 (phantom read)

팬텀 리드는 한 트랜잭션에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우를 의미한다. 이름 그대로 없던 row가 두 번째 쿼리에서 나타나는 현상이다. (즉, INSERT 쿼리에서 발생)

 

반복 가능하지 않은 조회 (non-repeatable read)

image

한 트랜잭션 내의 같은 행에 두 번이상 조회가 발생했는데, 그 값이 다른 경우를 의미한다. 팬텀 리드와의 차이점은 반복 가능하지 않은 조회는 행 값이 달라질 수 있는데, 팬텀 리드는 다른 행이 선택될 수도 있다는 것을 의미한다.

 

더티 리드 (dirty read)

image

더티 리드는 반복 가능하지 않은 조회와 유사하며, 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수행되었지만 커밋되지 않은 행의 데이터를 읽을 수 있을 때 값이 다른 문제를 의미한다. 즉, Write 작업이 이루어지고 있는 트랜잭션에 접근해서 발생한 문제이므로 READ_UNCOMMITTED 단계에서 일어난다.


REFERENCES

https://velog.io/@guswns3371/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC%EC%88%98%EC%A4%80

http://www.yes24.com/Product/Goods/108887922

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^