트랜잭션 격리수준을 알기위해 트랜잭션이 뭔지 먼저 알아보자
Transcation은 DB에 있는 데이터를 조작하기위해 수행하는 작업의 단위이다.
주로 SQL을 통해 이러한 작업이 일어난다.
하나의 프로그램이 돌아가면서 여러 SQL들이 쏟아지게되면 한 트랙잭션의 동작이 다른 트랜잭션의 동작에 영향을 줄 수 있다.
그렇게되면 내가 원하는 동작이 정상적으로 이루어지지 않을 수 있다.
동시에 여러 트랜잭션이 실행될 때 트랜잭션끼리 서로의 연산에 영향을 받지 않도록 하는 정도를 트랜잭션 격리수준이라고 한다.

격리수준이 낮다면 말그대로 각각의 트랜잭션 사이의 울타리가 낮다는 의미이다.
이는 장점과 단점을 둘다 가져올 수 있는데 격리 수준이 낮기때문에 동시 처리 능력이 높아진다.
동시처리 능력이 높아지게되면 전체적인 연산의 속도는 증가하겠지만 한 데이터를 두 트랜잭션을 통해 건들이는 상황이 생긴다면 데이터 일관성에 문제가 발생할 수 있다.
높은 격리수준은 어떨까?
트랜잭션 간의 울타리가 높아진다면 반대로 데이터의 일관성은 보장되겠지만 동시처리능력이 떨어지는 상황이 발생한다.
데이터 정합성과 성능은 반비례하다.
이러한 트랜잭션 격리수준은 개발자가 본인의 입맛에 맞게 설정할 수 있다.
격리수준에도 종류가 존재한다.
READ UNCOMMITTED, 커밋되지 않은 트랜잭션의 변경사항을 다른 트랜잭션에서 조회해볼 수 있는 수준이다.
이 단계에서는 Dirty Read, Phantom Read, Non-Reatable Read 문제가 발생할 위험이 있다.
READ UNCOMMITTED와 비슷하지만 커밋된 트랜잭션 변경사항만 다른 트랜잭션에서 조회할 수 있도록 허용하는 수준이다.
이미 커밋된 사항이기 때문에 Dirty Read 문제는 발생하지않지만 나머지
Phantom Read, Non-Reatable Read은 여전히 발생할 위험이 있다.
한 트랜잭션에서 특정 레코드를 조회 시 항상 같은 데이터를 응답하는 것을 보장한다. 추가적으로 행이 추가되는 것을 막지 않는다.
Non-Repeatable Read 문제는 발생하지 않지만, Phantom Read 문제는 여전히 발생할 수 있다.
3번에 REPEATABLE READ를 설명하면서 추가적인 행이 추가되는 것을 막지 않는다고 설명했다.
아예 사용중인 테이블의 모든행을 다른 트랜잭션에서 접근할 수 없도록 잠글수 있는 방법이 바로 SERIALIZABLE이다.
한 트랜잭션에서 완전히 테이블을 점유하고 사용하기 때문에 데이터 정합성은 가장 높지만 위에서 말한대로 성능이 가장 낮아진다.
많이 사용하는 MySQL에서는 단순한 SQL문이 실행되더라도 DB에 잠금이 걸려 다른 트랜잭션에서 해당 DB에 접근할 수 없다.
트랜잭션 격리수준에 대해 알아봤다.
각 항목별로 발생할 수 있는 오류에 대해서도 적어놓았는데 그렇다면 Dirty Read, Phantom Read, Non-Repeatable Read는 무엇을 말하는 걸까?
한 트랜잭션이 다른 트랜잭션이 변경 중인 데이터를 읽을 때 발생한다.
그래서 Read Uncommited 에서 발생할 수 있는 것이다.
커밋되지 않은 데이터는 이후 롤백 가능성이 있기 때문에 트랜잭션 결과가 변경될 수 있다.
문제가 발생하면 데이터의 일관성을 깨는 결과를 가져올 수 있다.
한 트랜잭션에서 동일한 쿼리를 두 번 실행했을때, 두 번의 쿼리 사이에 다른 트랜잭션이 삽입, 갱신, 삭제 등의 작업을 수행하여 결과 집합이 달라지는 경우를 말한다.
이 문제 또한 일관성없는 결과를 한 트랜잭션 안에서 발생시킬 수 있다.
마지막으로 Non-Repeatable Read 이다.
같은 트랜잭션 안에서 동일한 쿼리를 실행했을때, 다른 결과를 얻은 경우를 말한다.
트랜잭션 A가 같은 데이터를 두번 읽는다면 같은 결과를 두번 반복하는게 기대값이지만 두번 읽는 연산 사이에 트랜잭션 B가 데이터에 값을 변경하게되면 다른 값을 뱉어버릴 수 있다.
트랜잭션 격리 수준은 DB의 성능과 데이터 정합성 사이에서 적절한 균형점을 찾아야 하는 중요한 부분이다.
시스템의 요구사항에 따라 알맞는 격리수준을 선택해야 최적의 성능과 안정성을 동시에 확보할 수 있다.
면접 질문 내용과 답변의 일부는 기술 면접 구독 서비스 - 매일메일 에 있다.
흥미로웠다면 구독해보는 것도 추천한다!