기본

트랜잭션 격리 수준

초혼 2024. 2. 21. 05:30

트랜잭션 격리 수준

Transaction Isolation Level

 

DB를 최대한 효율적으로 활용하기 위해서는 여러 트랜잭션을 동시에 처리할 필요가 있다

하지만 트랜잭션을 동시에 처리하다보면 다른 트랜잭션 결과로 인해 의도화는 다른 트랜잭션 결과가 나오는 동시성 문제가 발생할 수 있다

 

여러 트랜잭션을 동시에 실행할 때 데이터 무결성을 확보하기 위해 데이터에 접근할 때 제약을 두어야 한다

제약이 많을수록 동시성 문제는 줄어들지만 성능은 떨어지게 된다

어떤 제약을 두었는지에 따라 나눈 것이 트랜잭션 격리 수준이다

 

Read Uncommited -> Read Commited -> Repeatable Read -> Serializable

 

성능과 무결성을 저울질해야하기 때문에 DB 사용방식에 따라 적절한 격리 수준을 선택해야 한다

 

 

Read Uncommited(Level 0)

아직 커밋이나 롤백되지 않은 트랜잭션의 내용을 다른 트랜잭션에서 조회 가능한 격리 수준

사실상 어떠한 제약도 없기 때문에 성능은 가장 좋지만 무결성 보장되지 않기 때문에 잘 사용하지 않는다

Dirty Read도 발생할 수 있다

 

 

Read Commited(Level 1)

한 트랜잭션의 변경 내용이 커밋되어야지만 다른 트랜잭션에서 조회 가능한 격리 수준

SELECT문을 실행하는 동안 Shared Lock이 걸린다

Non-Repeatable Read가 발생할 수 있다

 

 

Repeatable Read(Level 2)

트랜잭션이 시작되기 전에 커밋된 내용만 조회 가능한 격리 수준

MySQL 기본 격리 수준

트랜잭션이 완료될 때까지 SELECT문에서 사용하는 모든 데이터에 Shared Lock이 걸린다

Phantom Read가 발생할 수 있다

 

 

Serializable(Level 3)

트랜잭션을 순차적으로 처리하는 것과 동일하게 동작하는 격리 수준

어떠한 무결성 오류도 발생하지 않지만 성능이 가장 낮기 때문에 잘 사용하지 않는다