개발놀이터

면접 준비 : 데이터베이스 격리수준 본문

CS 지식/면접준비

면접 준비 : 데이터베이스 격리수준

마늘냄새폴폴 2022. 12. 22. 01:13

Q. 트랜잭션의 격리수준에 대해 설명해주세요
A. 여러 트랜잭션이 처리될 때, 특정 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를  결정하는 것입니다. 격리 수준으로는 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 이렇게 네가지가 있습니다. 

Q. 각각에 대해 설명해주세요 (꼬리질문)
A. READ UNCOMMITTED는 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있습니다. READ UNCOMMITTED에서는 한쪽에서 커밋을 하지 않고 롤백을 하더라도 다른 트랜잭션에서 이를 참조할 수 있기 때문에 가장 안전성이 낮은 격리수준으로 사용하지 않는 격리수준입니다. READ COMMITTED는 커밋된 내용만 참조할 수 있는 격리수준입니다. 오라클에서 사용하는 격리 수준으로 READ UNCOMMITTED와는 다르게 커밋이 되어야 확인할 수 있기때문에 UNCOMMITTED 보다는 높은 격리 수준을 가지고 있습니다. 하지만 READ COMMITTED는 하나의 트랜잭션내에서 동일한 SELECT 쿼리를 실행했을 때 항상 같은 결과를 보장해야 한다는 REPEATABLE READ 정합성에 어긋납니다. NON-REPEATABLE READ 부정합은 하나의 트랜잭션에서 동일한 데이터를 여러번 읽고 변경하는 작업이 금전적인 처리와 연결되면 문제가 될 수 있습니다. REPEATABLE READ는 MySQL에서 사용하는 격리수준으로 REPEATABLE READ는 READ COMMITTED에서 발생하는 부정합이 발생하지 않습니다. 하지만 REPEATABLE READ에서는 PHANTOM READ라는 부정합 문제가 발생합니다. PAHNTOM READ는 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다 안보였다 하는 현상을 PHANTOM READ 현상이라고 합니다. 만약 SELECT 문에서 FOR UPDATE 구문을 사용한다면 해당 문제가 발생합니다. 하지만 MySQL의 InnoDB 스토리지 엔진에서는 독특한 특성 때문에 REPEATABLE READ 격리 수준에서도 PHANTOM READ 현상이 발생하지 않습니다 PHANTOM READ 문제를 해결하기 위해 나온 가장 엄격한 격리수준이 바로 SERIALIZABLE 입니다. 단순한 연산에도 락이 걸리기 때문에 처리 성능이 다른 격리 수준보다 현저히 떨어집니다. 그래서 잘 사용하지 않는 격리수준입니다. 

Q. InnoDB 스토리지 엔진의 독특한 특성이 뭔가요? (꼬리질문)
A. InnoDB에 gap locking 이라는 기술덕분에 PHANTOM READ를 피해갈 수 있었습니다. gap locking이란 실제 존재하지 않는 레코드 공간을 잠그는 것을 말합니다. 

 

 

https://coding-review.tistory.com/196

 

데이터베이스 격리수준 (isolation level)

우선 데이터베이스 격리수준을 들어가기 전에 우리는 트랜잭션에 대해서 간단한 이해가 필요합니다. 트랜잭션 트랜잭션은 데이터의 정합성을 보장하기 위한 기능입니다. 트랜잭션은 꼭 여러개

coding-review.tistory.com