Isolation Level

Wonbin Lee·2022년 5월 3일
0

Database

목록 보기
3/4

Isolation Level

트랜잭션 격리수준(Isolation Level)이란 동시에 여러 트랜잭션이 처리 될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것이다.

데이터베이스는 ACID 특징과 같이 트랜잭션이 독립적인 수행을 하도록 Locking을 통해, 트랜잭션이 데이터베이스를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 막는 것이 중요하다.

하지만 Locking을 강화할수록, 즉 트랜잭션의 동시성 제어를 강화할수록, 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하는 방식으로 구현 시 데이터베이스의 성능은 떨어지게 된다.

따라서 효율적인 Locking 방법이 필요하다.


Isolation Level의 종류


Level 0 - Read Uncommited

commit되지 않은 데이터까지 읽을 수 있도록 허용하는 level. 가장 낮은 고립 수준을 가지고 있다.
따라서 Dirty read/Non-repeatble read/phantom read를 막을 수 없고, 최종적으로 rollback될 수도 있는 데이터까지 읽을 수 있는 위험이 있다.

Level 1 - Read committed

commit 된 데이터만 읽을 수 있도록 허용하는 level. 읽기가 수행되는 동안 해당 데이터에 Shared Lock이 걸린다. 갱신하려는 데이터에는 Exclusive Lock이 걸리고 트랜잭션이 끝날 때까지 유지한다.
Dirty read는 방지할 수 있으나, non-repeatable read/phantom read는 막을 수 없다. 그래서 한 트랜잭션에서 데이터를 여러 번 read할 때, 데이터의 일관성은 보장할 수 없다.

Level 2 - Repeatable Read

한 transaction 내에서 여러 번 데이터를 읽어도 데이터가 변하지 않음을 보장하는 level.

SELECT되는 데이터에 대해 Shared Lock을 걸고 트랜잭션이 끝날 때까지 유지한다. 갱신하려는
데이터에 대해서는 Exclusive Lock이 걸리고 트랜잭션이 끝날 때까지 유지한다.

Non-Repeatable Read 부정합이 발생하지 않으며, Phantom Read가 발생한다.

*Phantom Read : 한 트랜잭션이 일정 범위의 데이터를 여러 번 읽을 때, 다른 튼랜잭션에 의해 새로운 데이터로 갱신되어 쿼리 수행결과가 다르게 나오는 현상.

Level 3 - Serializable

가장 높은 Isolation Level로, 당연히 가장 높은 고립수준을 가진다.

SELECT되는 투플들 뿐만 아니라 인덱스에 대해서도 Shared Lock를 걸고 트랜잭션이 끝날 때까지 유지하며,갱신하려는 데이터에 대해서는 Exclusive Lock를 걸고 트랜잭션이 끝날 때까지 유지한다.
다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.



Isolation Level 선택

Microsoft 문서에는, 최소 Repeatable Read 레벨은 적용해야 한다고 되어 있다.

Transactions must be run at an isolation level of at least repeatable read to prevent lost updates that can occur when two transactions each retrieve the same row.

가장 높은 단계인 Serializable 단계까지 적용하면 언급된 이슈들은 최소화 할 수 있겠지만 동시처리 기능이 매우 저하되므로, 자신이 필요한 수준에 따라 적절한 Isolation Level을 적용해야 할 것이다.

profile
Developer who level up every day ✌️

0개의 댓글