본문 바로가기
개인적 정리

트랜잭션 Isolation levels

by 설이주인 2022. 10. 14.

우선 위의 개념을 이해하기 앞서 두가지를 이해하고 넘어가자

  1. isolation의 사전적 의미 : 격리
  2. transaction의 ACID
  • A (Atomicity) : 원자성 - All or Nothing, 작업 단위에서는 성공 또는 실패만 존재한다.
  • C (Consistency) : 일관성 - 작업 이전과 같은 상태 유지, 서로 다른 타입에 다른 값이 들어가지 않게 하는것
  • I (Isolation) : 격리성 - 한 동작을 진행하는 중에는 다른 작업이 끼어들지 못하도록 보장하는 것
  • D (Durability) : 지속성 - 작업 완료 > commit 된 작업은 영구적으로 유지 되어야 하는것

Isolation Level

위의 ACID의 원칙들을 타이트하게 지키면 동시성 즉 사용자들이 다수 한번에 접근하는 상황에서는 퍼포먼스 저하가 발생한다. 이러한 상황에서 우리는 isolation Level을 따로 두면서 퍼포먼스를 챙겨야한다. 하지만 언제나 그렇듯 제약을 살짝만 풀어도 문제가 발생할 확률은 올라간다.

Isolation Level은 다음과 같다

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

READ UNCOMMITTED

select 쿼리 중 다른 트랜잭션의 commit 되지 않은 데이터를 읽어올 수 있다.

commit 되지 않은 데이터를 읽는 현상을 더티 리드(dirty read)라고 한다.

해당 데이터의 문제는 insert만 진행되고 rollback 될 수도 있는 commit이 이뤄지지 않은 데이터를 읽을 수 있음을 유의해야한다.

 

READ COMMITED

commit이 완료된 데이터만 select에서 보여준다. read commited에서는 dirty read가 발생하지 않는다

read commited의 문제는 하나의 트랜잭션 안에서 select된 데이터의 일관성을 보장 해주지 않습니다.

commit된 데이터를 읽지만 다른 트랜잭션에서 commit된 순간 기존 데이터가 아닌 방금 commit된 데이터를 읽어주기 때문이다. 이러한 상황으로 read committed는 non-repeatable read라고 불린다.

 

→ Consistent Read : read(select)를 실행할 때 현재의 DB갑시 아닌 특정 시점의 DB snapshot을 읽어오는 것, 위의 snapshot은 commit된 상태

 

REPEATABLE READ

read committed와 다르게 한 트랜잭션 안에서 반복적으로 select를 하더라도 읽는 값이 변하지 않음을 보장한다. reapeatable read 트랜잭션은 처음 select을 진행하면 시간을 기록, 이후 모든 select마다 해당 시점을 기준으로 Consistent Read를 수행한다. 그래서 commit이 되더라도 바뀐 데이터로 보이지 않는다

WHY? select시에 앞에 생성 되었던 snapshot을 읽어오기 때문이다

 

READ COMMITTED, REPEATABLE READ는 Phantom Read가 발생한다

Phantom Read : 트랜잭션에서 UPDATE 명령이 유실되거나 덮어씌어질수 있다. UPDATE 후 COMMIT하고 다시 조회 했을때 예상과 다른 값이 보이거나 그 데이터가 유실 된 경우를 Phantom Read라고 한다.

 

SERIALIZABLE

serializable은 모든 작업을 하나의 트랜잭션에서 처리하는 가장 높은 고립수준으로 제공한다.

READ COMMITTED, REPEATABLE READ와 다르게 select 쿼리가 전부 select for share로 자동 변경되어서 repeatable read에서 막을 수 없는 몇 상황을 방지할 수 있게 됩니다.

 

CURD에는 어떤 레벨을 사용할까?

READ : REPEATABLE READ

CREATE, UPDATE, DELETE : SERIALIZABLE

 

 

 

참고

https://chrisjune-13837.medium.com/db-transaction-isolation-level-f21b6d1e64eb

 

[DB] Transaction Isolation Level이란?

데이터베이스의 기초개념인 트랜젝션 격리수준에 대해 알아봅니다.

chrisjune-13837.medium.com

 

'개인적 정리' 카테고리의 다른 글

네트워크 기본 정리  (0) 2023.10.19
[Linux] 명령어 정리  (0) 2023.08.08
MEMO 22.10.10  (0) 2022.10.10
next(), nextLine()  (0) 2022.09.27
java -jar jar이름.jar 실행  (0) 2022.08.02