ssausand-sunny / cs-study

면접.. 붙으려면 CS 공부 해야겠지?
0 stars 0 forks source link

트랜잭션의 고립레벨에 대해 설명해주세요 #44

Open Leeminw opened 4 months ago

Leeminw commented 4 months ago

문제

예상 꼬리 질문 - 각각의 단계에서 발생하는 문제점과 그에 대하여 설명해주세요?

들어가야 할 키워드 정리

kgh2120 commented 3 months ago
예상 답변 트랜잭션의 고립 레벨이란, 여러 트랜잭션이 동시에 동작할 때, 한 트랜잭션의 작업 결과를 다른 트랜잭션에서 볼 수 있는지를 나타내는 단계입니다. 총 4가지 단계로 구분됩니다. 커밋되지 않은 정보를 읽을 수 있는 read uncomited, 커밋된 정보만을 읽을 수 있는 read comited, 한 트랜잭션에서 반복되어 같은 데이터를 읽을 수 있는 repeatable read, 마지막 serializable은 모든 트랜잭션이 직렬화된 상황을 말합니다.
예상 꼬리 질문 답변 - 각각의 단계에서 발생하는 문제점과 그에 대하여 설명해주세요 read uncomited에서는 말 그대로 커밋하지 않은 데이터들이 보이는, dirty read 문제가 발생합니다. read comited에서는 보이던 데이터가 다시 보이지 않는 Non-Repeatable Read가 발생할 수 있습니다. repeatable read에서는 반복해서 읽는 도중 새로운 데이터가 보이는 phantom read 문제가 발생할 수 있습니다. 상위 단계에서 발생하는 문제는 하위 단계에서도 마찬가지로 발생할 수 있습니다.
Leeminw commented 3 months ago
예상 답변

트랜젝션의 고립레벨이란 데이터베이스의 가용성을 확보하기 위해 각 트렌젝션간의 간섭을 조절하는 레벨입니다. 트렌젝션의 고립레벨은 총 4가지의 단계가 있습니다 read uncommited, read commited, repeatable read, serializable로 각각을 설명하면, - read uncommited 의 경우 각 트렌젝션끼리 커밋되지 않은 데이터를 볼 수 있는 레벨입니다. - read commited는 커밋된 데이터를 볼 수 있는 레벨입니다. - repeatable read는 트렉젝션이 시작될때의 데이터를 기준으로 쿼리를 수행하는 레벨입니다. - serializable은 모든 트렌젝션이 간섭할 수 없게 하나씩 처리하는 레벨입니다.

꼬리 질문

- read uncommited 레벨에서는 durty read 현상이 발생합니다. 커밋되지 않는 데이터들이 출력되기 때문에 보통 사용되지 않습니다. - read commited 레벨 경우에는 non repeatable read 현상이 발생합니다. 같은 쿼리를 조회하여도 그 사이에 다른 트렌젝션의 커밋이 이루어진다면 결과가 달라지게 됩니다. - repeatable read 레벨의 경우에는 phantom read 현상이 발생합니다. phantom read 의 경우 범위를 조회할때 이전에 조회되지 않는 데이터들이 보이는 현상을 말합니다.

kjy0349 commented 3 months ago
예상 답변

트랜잭션 격리레벨은 Read uncommited, Read commited, Repeatable Read, Serializable이 있습니다. Read uncommitted의 경우, 해당 트랜잭션에서 다른 트랜잭션이 수행한 커밋되지 않은 값까지 조회가 가능한 격리레벨입니다. 더티리드, 넌-리피터블 리드, 팬텀리드 문제 모두 발생합니다. Read committed의 경우, 조회시 공유락을 짧게 잡아 커밋 된 데이터만 읽는 격리레벨을 말합니다. 더티리드 문제가 발생하지 않습니다. Repeatable Read의 경우, 조회시 트랜잭션을 수행하는 내내 공유락을 걸어 조회 된 데이터가 변하지 않습니다. 넌-리피터블 리드 문제또한 해결한 격리레벨입니다. 다만, 테이블 전체에 락이 걸려있지 않기 때문에 새로운 데이터가 추가되면 다시 조회되는 팬텀리드 문제가 발생합니다. Serializable의 경우 repeatable read와 같이 공유락과 배타락을 사용하지만, 락 범위를 쿼리 조회 데이터 전체를 기준으로 적용시키기 때문에 동시성 문제가 발생하지 않는 격리레벨입니다. 팬텀리드 문제 또한 해결되었습니다. 다만 다른 격리레벨에 비해 성능이 떨어집니다.

Hunnibs commented 3 months ago
질문 답변

트랜잭션 격리레벨은 Read uncommited, Read commited, Repeatable Read, Serializable이 있습니다.

꼬리 질문

- 각각의 단계에서 발생하는 문제점과 그에 대하여 설명해주세요? Read uncommited : 0 level로 분류되며 읽기, 쓰기가 아무 제한 없이 가능합니다. 해당 레벨에서는 읽는 도중 변경이 일어나는 Dirty Read가 발생합니다. Read commited : 1 level로 쓰기 즉, update, insert 명령을 수행할 때 트랜잭션을 걸어 읽기 작업은 쓰기 작업이 모두 끝난 이후 가능합니다. 다만 해당 방식은 두 번에 동일한 쿼리를 보냈을 때 update 작업이 동작하여 전과 후의 결과가 다르게 나타나는 Non-repeatable read와 insert, delete 작업이 동작하여 데이터의 정합성이 깨지게 되는 phantom-read 문제점이 발생합니다. Repeatable Read : 해당 방식은 읽는 작업이 관리의 주체가 되기 때문에 동일한 쿼리를 두 번 쏘아도 읽기 작업을 하는 동안 update가 되지 않도록 통제합니다. 하지만 여전히 phantom-read의 문제점은 발생합니다. Serializable은 모든 것을 직렬화하여 처리하기 때문에 문제가 발생하지 않습니다. 하지만 성능 상 저하가 일어납니다.