트랜잭션 격리수준(Transaction Isolation Levels)

jaeyong Lee·2024년 7월 26일
0

트랜잭션 격리수준(Transaction Isolation Levels)이란?

여러 트랜잭션이 동시 수행될 때 각각의 트랜잭션이 얼마나 격리되어 있는지를 정의한다.
--> 트랜잭션간의 상호간섭을 제어하는데 중요한 역할

sql표준에서의 주요 트랜잭션 격리 수준

Read Uncommitted (읽기 미완료)

트랜잭션이 커밋되지 않은 데이터를 읽을 수 있다. 가장 낮은 격리 수준으로 dirty read발생가능

※dirty read: 한 트랜잭션이 다른 트랜잭션에서 아직 커밋되지 않은 데이터를 읽을 때 발생
t1이 롤백하면 t2는 잘못된 데이터를 읽는다.

Read Committed (읽기 완료)

커밋된 데이터만 읽을 수 있음, 대부분 DB의 기본 격리 수준
Non-repeatable Read, phantom Read 발생가능

※Non-repeatable Read : 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션이 데이터를 수정하거나 삭제하여 두 번의 쿼리 결과가 다른 경우 발생하는 경우

※phantom Read : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션이 데이터를 삽입하여 두 번의 쿼리 결과에 추가된 행이 나타나는 경우

Repeatable Read (반복 가능 읽기)

다른 트랜잭션이 데이터를 수정할 수 없도록 한다.
phantom read 발생가능

Serializable(직렬화 기능)

가장 높은 격리 수준으로 , 트랜잭션을 완전히 직렬화하여 실행한다.
성능 저하를 초래할 수 있다.

정리

Read Uncommitted: Dirty read 가능
Read Committed: Dirty read 불가능, Non-repeatable read와 Phantom read 가능
Repeatable Read: Dirty read와 Non-repeatable read 불가능, Phantom read 가능
Serializable: Dirty read, Non-repeatable read, Phantom read 모두 불가능

질문 : 웹개발에서 읽기완료 수준을 사용하는데 부작용이 2개나 있지 않나?

일반적엔 웹 앱에서는 부작용이 발생할 가능성이 낮고 발생하더라도 사용자 경험에 큰 영향을 미치지 않는다.(but 금융쪽 같은 경우는 더 높은 일관성을 요구할 가능성이 높음)

기본 db설정이 읽기완료 수준의 설정이고 이는 충분한 일관성 제공하기 때문

--> 현실적인 선택

0개의 댓글