Open Leeminw opened 4 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 의 경우 범위를 조회할때 이전에 조회되지 않는 데이터들이 보이는 현상을 말합니다.
트랜잭션 격리레벨은 Read uncommited, Read commited, Repeatable Read, Serializable이 있습니다. Read uncommitted의 경우, 해당 트랜잭션에서 다른 트랜잭션이 수행한 커밋되지 않은 값까지 조회가 가능한 격리레벨입니다. 더티리드, 넌-리피터블 리드, 팬텀리드 문제 모두 발생합니다. Read committed의 경우, 조회시 공유락을 짧게 잡아 커밋 된 데이터만 읽는 격리레벨을 말합니다. 더티리드 문제가 발생하지 않습니다. Repeatable Read의 경우, 조회시 트랜잭션을 수행하는 내내 공유락을 걸어 조회 된 데이터가 변하지 않습니다. 넌-리피터블 리드 문제또한 해결한 격리레벨입니다. 다만, 테이블 전체에 락이 걸려있지 않기 때문에 새로운 데이터가 추가되면 다시 조회되는 팬텀리드 문제가 발생합니다. Serializable의 경우 repeatable read와 같이 공유락과 배타락을 사용하지만, 락 범위를 쿼리 조회 데이터 전체를 기준으로 적용시키기 때문에 동시성 문제가 발생하지 않는 격리레벨입니다. 팬텀리드 문제 또한 해결되었습니다. 다만 다른 격리레벨에 비해 성능이 떨어집니다.
트랜잭션 격리레벨은 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은 모든 것을 직렬화하여 처리하기 때문에 문제가 발생하지 않습니다. 하지만 성능 상 저하가 일어납니다.
문제
예상 꼬리 질문
- 각각의 단계에서 발생하는 문제점과 그에 대하여 설명해주세요?들어가야 할 키워드 정리