본문 바로가기
[ Computer Science ]/CS study

[Database] 트랜잭션 격리 수준에 대해 간단하게 설명하기

by dev charlotte 2024. 12. 31.

트랜잭션의 격리 수준이란 동시에 여러 트랜잭션이 실행될 때 한 트랜잭션이 다른 트랜잭션의 연산 영향을 받지 않도록 하는 정도를 의미한다. 격리 수준이 낮을 수록 동시 처리 능력을 높이지만 격리시켜 독립적인 작업을 보장하는 정도가 낮기 때문에 데이터 일관성 문제를 일으킬 수 있다. 반대로 격리 수준이 높다면 데이터 일관성을 보장할 수 있지만 동시에 작업을 처리하는 능력은 낮을 수 있다. 

 

데이터의 정합성과 작업 처리 성능은 함께 보장되기 어려운 반비례 관계이다. 트랜잭션 격리 수준은 개발자가 트랜잭션 격리 수준을 설정할 수 있는 기능을 제공하는 것으로 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ가 있다.

 

READ UNCOMMITTED는 커밋 되지 않은 트랜잭션의 수정 사항을 다른 트랜잭션이 읽을 수 있게 허용하는 수준이다. 

 

a에서 수정한 내용을 커밋하지 않은 상태에서 b가 수정한 데이터를 읽도록 허용하면 b가 읽은 이후에 a가 롤백했을 때 b가 읽은 데이터는 실제로 존재하지 않는 잘못된 값이 되기 때문에 dirty read 문제가 발생한다. 

 

이 수준에서는 인덱스나 테이블에 대한 락이 적용되지 않는 상황이라 a에서 읽고 있을 때 b에서 쓰거나 지울 수 있다. 그러면 a에서 같은 쿼리문을 첫 번째 실행했을 때와 두 번째 실행했을 때 출력되는 결과가 다른 phantom read가 발생한다. 

 

a가 읽는 동안 b가 수행하면 같은 데이터를 조회하는 시점에 따라 출력 결과가 달라지는 non repeatable read가 발생한다. 

 

 

READ COMMITTED 는 수정 사항 중 커밋된 것만 다른 트랜잭션에서 조회할 수 있도록 허용하기 때문에 특정 트랜잭션이 수행되는 동안 다른 트랜잭션은 접근할 수 없다.

 

그래서 다른 트랜잭션에서 커밋되지 않은 데이터를 읽는 dirty read 문제는 일어나지 않는다. 하지만 read comitted는 트랜잭션이 데이터를 읽을 때마다 가장 최신의 커밋 데이터를 반환하기 때문에 동일한 트랜잭션 내에서 같은 데이터를 두 번 조회할 때 중간에 수정, 커밋되면 이전과 다른 값을 읽는 non repeatable read문제가 발생할 수 있다.

 

또한 read committed는 데이터 조회할 때마다 커밋 데이터 기준으로 조회하기 때문에 트랜잭션 중간에 다른 트랜잭션이 새로운 데이터를 삽입하면 동일한 쿼리문으로 여러 번 수행했을 때 이전에 얻었던 결과 집합과는 다르게 팬텀 행이 등장하는 phantom read 문제가 발생할 수 있다. 

 

REPEATABLE READ는 한 트랜잭션에서 특정한 레코드를 조회할 때 항상 같은 데이터를 응답하도록 보장하는 것이다.

 

하지만 특정 트랜잭션이 사용 중인 테이블의 모든 행을 다른 트랜잭션이 접근할 수 없게 막는 SERIALIZABLE과 다르게 행이 추가되는 걸 막지는 않아서 다른 트랜잭션이 같은 조건을 만족하는 행을 새로 삽입하고 커밋하면 다시 같은 쿼리로 조회할 때 결과 집합에 새로운 행이 추가되기 때문에 phantom read 문제가 발생할 수 있다 

 

반면 트랜잭션이 시작할 때 읽은 행에 대해서는 읽기 잠금 shared lock을 유지하기 때문에 실행되는 동안 다른 트랜잭션이 그 데이터를 수정하거나 삭제할 수 없어서 동일한 데이터를 조회하면 항상 같은 값을 리턴할 수 있어서 non repeatable read문제가 일어나지 않는다. 

 

방금 언급된 SERIALIZABLE 에서 높은 데이터 정합성을 제공할 수 있는 이유는 테이블 전체에 대해 range lock을 적용시키기 때문에 새로운 행을 추가하거나 기존에 있던 데이터를 수정하는 모든 행위가 불가해서 phantom read 문제를 방지할 수 있는 것이다. 

 

하지만 range lock 특성상 단순한 select 쿼리더라도 전체 테이블 범위 모두 적용되는 것이라 동시성을 제한하고 다른 트랜잭션에 접근하려고 할 때 기다려야 해서 읽기나 쓰기가 많이 동시에 발생하는 환경이면 보틀넥이 발생하기 쉽다. 

 

 

728x90