SQL

[Database] 트랜잭션 격리수준(Transaction Isolation Level)

딩관 2022. 10. 28. 17:45

트랜잭션 ACID 중 I(Isolation)에 해당하는 격리성에 관한 격리 수준을 의미합니다.

병렬처리되는 트랜잭션을 완전한 격리가 아닌 격리의 수준을 지정해서 작동을 하게됩니다.

DIRTY READ, NON-REPEATABLE READ, PHANTOM READ와같이 각각 격리 단계에서 발생할 수 있는 부정합이 있습니다.

SERIALIZABLE(직렬화)

가장 엄격한 격리 수준으로 완벽한 읽기 일관성 모드 제공합니다.

한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없습니다.

교착상태가 많이 발생하여 DB성능이 떨어집니다.

REPEATABLE READ

한 트랜잭션이 접근하는 데이터에대해 다른 트랜잭션이 수정하지 못하는 격리수준을 의미합니다.

하지만 새로운 데이터를 추가하는 INSERT문은 막지 않기때문에 같은 트랜잭션 내의 조회결과가 달라질 수 있습니다.

A 트랜잭션 시작                           B트랜젝션 시작            
                                      SELECT * FROM A (조회가 되지않음)
INSERT '123'               
COMMIT
                                      SELECT * FROM A (1개가 조회)

이를 팬텀리드라고 합니다.

팬텀리드

한 트렌잭션 내에 동일한 쿼리문을 보냈을때 결과가 다른경우

(row의 갯수가 다를때)

READ_COMMITTED

커밋이 완료된 데이터만 조회가 가능합니다.

하지만 한 트랜잭션에서 접근한 데이터를 다른 트랜잭션에서 수정이 가능합니다.

  • InnoDB 스토리지 엔진에서 기본적으로 사용되는 격리 수준

이로 인해 한 트랜잭션 내의 조회 결과가 달라질 수 있습니다.

A table
id=1, title = '123'

A 트랜잭션 시작                           B트랜젝션 시작            
                                      SELECT * FROM A (title ='123')
update '123' -> '111'             
COMMIT
                                      SELECT * FROM A (title = '111')

이를 non-repaetable read(반복가능하지않은 조회)라고 합니다.

팬텀리드와 다른점은 팬텀리드는 row의 갯수가 변하지만 non-repeatabe read는 데이터의 정보가 바뀝니다.

READ_UNCOMMITTED

커밋이 완료되지 않은 데이터에도 조회가 가능한것을 의미합니다.

가장 격리수준이 떨어지며 DirtyREAD가 발생합니다.

DIRTY READ

아직 커밋되지않은 데이터가 조회되는것을 의미

 

정리

격리 수준 DIRTY READ NON-REPEATABLE READ PHANTOM READ
READ UNCOMMITTED O O O
READ COMMITTED   O O
REPEATABLE READ     O(InnoDB는 발생 X)
SERIALIZABLE      
  • 각각 격리 수준에서는 3가지 데이터 부정합이 발생할 수 있다
  • 밑으로 갈수록 동시성이 떨어지는 대신 격리성이 올라간다
  • 도잇성이 떨어지나는 얘기는 속도가 저하되는것을 의미합니다

출처

https://zzang9ha.tistory.com/381

 

[MySQL] - 트랜잭션의 격리 수준(Isolation level)

📎 글또 6기 포스팅 1. 미치도록 더웠던 7월의 회고 2. 사용자가 게시물을 작성할 때의 트랜잭션 처리 3. Spring AOP - (1) 프록시 패턴, 데코레이터 패턴 4. [MySQL] - 트랜잭션의 격리 수준(Isolati

zzang9ha.tistory.com