트랜잭션 고립화 레벨

xlwdn·2022년 10월 20일
0

낮은 단계의 트랜잭션 고립화 수준 사용 시 발생하는 현상


Dirty Read


트랜잭션이 rollback하였음에도 다른 트랜잭션이 rollback되기 이전의 데이터를 갖고 있는 경우

→ 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽을 수 있도록 허용할 때 발생(오라클에선 해당 문제 발생 x)

Non-Repeatable Read


트랜잭션이 수행되는 동안 다른 트랜잭션에 의해 값이 변경, 또는 삭제되어(update/delete) 데이터의 일관성이 보장되지 않는 현상 → 트랜잭션을 수행하는 동안 두 쿼리의 결과가 상이하게 나타나 비일관성이 발생하는 것.

Phantom Read


트랜잭션 수행 중, 다른 트랜잭션에 의해 데이터가 추가되고 다시 읽었을 때 유령 레코드가 발생하는 현상

트랜잭션 수준 읽기 일관성


문장 수준 읽기 일관성


쿼리가 시작된 시점 기준으로 일관성 있게 데이터를 읽는 것

트랜잭션 수준 읽기 일관성


트랜잭션이 시작된 시점을 일관성 있게 데이터를 읽어 들이는 것

트랜잭션 고립화 수준


Read Committed(레벨 0)


  • 아무런 제한 x
  • Oracle은 이 레벨을 지원하지 않음

Read Committed(레벨 1)


  • Dirty Read 방지: 커밋되 데이터만 읽도록 하여 일관성 보장
  • 대부분의 DBMS가 기본적으로 채택하여 사용하는 모드
  • Non-Repeatable Read, Phantom Read 현상은 여전히 발생
  • DB2, SQL Server, Sybase의 경우 읽기 공유 Lock을 구현하여 하나의 레코드를 읽을 때 Lock 설정 → 레코드를 빠져나올 때 Lock 해제
  • Oracle은 Undo 데이터를 읽는 방식으로 구현

Repeatable Read(레벨 2)


  • 선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 수정하지 못하도록 하여 같은 데이터를 다시 조회하였을 때 일관성 보장
  • Phantom Read 현상 여전히 발생(데이터가 추가되는 것이므로)
  • DB2, SQL Server의 경우 트랜잭션 레벨을 Repeatable Read로 변경하여 읽은 데이터에 걸린 공유 Lock을 커밋할 때까지 유지하는 방식으로 구현
  • Oracle은 이 레벨을 명시적으로 지원하지 않지만, for Update 절을 이용해 구현 가능

Serializable Read


  • 선행 트랜잭션이 수행중일 때 후행 트랜잭션이 갱신하거나 삭제하지 못할 뿐만 아니라 중간에 새로운 레코드를 삽입하는 것도 막음.
  • 완벽한 읽기 일관성 모드 제공

0개의 댓글