트랜잭션, 트랜잭션 격리 수준

yookyungmin·2023년 9월 26일
0

유튜브에 정리가 잘된 영상이라 생각해서 시청후 블로그 포스팅을 하고자 합니다.

Transaction

  • DB의 상태를 변환 시키는 하나의 논리적 기능을 수행하기 위한 작업 단위
  • 트랜잭션은 데이터의 정합성을 보장하기 위힌 기능입니다.
  • 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구하기 위함.

Transaciton 특징

원자성(Atomicity)

  • 트랜잭션과 관련된 작업들이 부분적으로 실행되디가 중단되지 않는것을 보장하는 능력.
  • 트랜잭션이 DB에 모두 반영되거나 전혀 반영되지 않거나이다. All Or Nothing을 의미한다.

일관성(Consistency)

  • 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 합니다.
  • 만약 무결성 제약 조건을 항상 만족해야 한다.
  • 데이터 무결성은 데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미합니다.

독립성, 격리성(isolation)

  • 트랜잭션을 수행 시 다른 트랜잭션의 연산작업이 끼어들지 못하도록 보장하는 것을 의미한다.

지속성(Durability)

  • 성공적으로 수행 된 트랜잭션은 영원히 반영되어야 함을 의미한다.
  • 중간에 시스템에 문제가 발생해도 DB 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.

Transaction이 동시에 실행 될때 발생 가능한 현상들

Dirty Read

  • 트랜잭션1번이 동작 중, 트랜잭션2번이 동작되고 커밋이 안되고 롤백이 되었을 때이 커밋이 되지 않은 바뀐 데이터를 읽어 들였을때 발생하는 현상입니다.
  • 아직 커밋(Commit)되지 않은 다른 트랜잭션의 데이터를 읽는 것을 의미합니다.

Non-repeatable read, Fuzzy read

  • 트랜잭션1번이 동작 되었을 때, 트랜잭션2번이 반영된 데이터를 가져와서 10이 아닌 50을 가져 왔습니다.
  • Isolation 관점에서 보면 여러 트랜잭션이 동시에 실행 되도 각각의 트랜잭션이 마치 혼자서 실행되는 것처럼 동작해야 한다는 점이랑 다르게 이상한 현상이다.
  • 다른 트랜잭션이 커밋(Commit)한 데이터를 읽을 수 있는 것을 의미합니다.
    즉, 한 트랜잭션에서 같은 쿼리로 2번이상 조회했을 때 그 결과가 상이한 상황을 말한다.
    보통 데이터의 수정/삭제가 발생했을 경우 발생합니다.

Phantom read

  • 트랜잭션이1번이 동작되고, 트랜잭션2번이 커밋된 데이터를 가져와서 같은 조건으로 데이터를 읽었는데 다른 데이터 결과를 가져왔습니다.
  • 이 또한 Isolaton 관점에서 이상한 현상이다.
  • 다른 트랜잭션이 커밋(Commit)한 데이터가 있더라도 자신의 트랜잭션에서 읽었던 내용만 사용하는 것을 의미합니다.

즉, 한 트랜잭션에서 같은 쿼리를 2번이상 조회했을 때 없던 결과가 조회되는 상황을 말합니다.

보통 데이터의 삽입이 발생했을 경우 발생합니다.

문제점

이런 이상한 현상들이 모두 발생하지 않게 만들 수 있지만, 제약사항이 많아져서 처리가능한 트랙잭션 수가 줄어들어 DB 전체 처리량이 하락하게 된다.

대안

일부이상한 현상은 허용하는 몇가지 level을 만들어서 사용자가 필요에 따라서 적절하게 선택할 수 있도록 하자

Sql 표준 isolation level

  • 동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것.

  • 세 가지 이상 현상을 정의하고 어떤 현상을 허용하는지에 따라서 각각의 isolation level이 구분된다.

isolation level 비판

  • 세 가지 이상 현상의 정의가 모호하다.
  • 이상 현상은 세 가지 외에도 있다.
  • 상업적인 DBMS에서 사용하는 방법을 반영해서 구분하지 않았다.

추가 이상 현상

Dirty Write

  • 두 개의 트랜잭션이 트랜잭션이 write할때, 만약에 rollback 을 하게 되는 경우가 발생 했을 떄 이상현상이 생기는 경우
  • commit이 안된 데이터를 write를 할 때 발생
  • rollback 시 정상적인 recovery는 매우 중요해서 모든 level에서 허용하면 안된다.

lost update

  • 트랜잭션이 순차적으로 실행 안되고, 트랜잭션1, 2번이 겹쳐서 실행 되다 보니까 업데이트가 반영이 안된 상황이다.

Dirty read - abort 가 발생하지 않아도 발생할 수 있다.

  • 커밋 되지 않은 데이터를 읽어 데이터의정합성이 깨져서 데이터의 불일치가 발생
  • Dirty read 의 개념이 확장적으로 쓰여야 한다는 주장.

Read skew

  • 데이터가 불일치한 읽기 현상
  • Non-repeatable read 와 처럼 동작하는 현상

  • 서로 다른 데이터를 썼음에도 데이터 불일치 현상

Phantom read 확장

  • 같은 조건을 두번을 읽는 경우가 아니여도, 서로 연관 된 데이터가 있는 경우에는 중간에 어떤 데이터가 추가 됐을 때 이상 현상이 발생할 수 있다.

추가적인 이상 현상을 통해 기존의 표준에서 정의한 세가지 현상에서도 넓은 개념으로 확장해서 써야 한다는 주장.

Snapshot isolation

  • 기존에 표준에서 정의한 level하고는 약간 다르다.
  • 이상한 현상 3가지를 정의한 뒤에 얼마만큼 허용하는지에 따라 level을 구분하였는데, 컨크런시 컨트롤이 어떻게 동작할지 그 구현을 바탕으로 정의된 것.

Snapshot 트랜잭션이 시작하는 시점을 기준으로 DB 데이터를 가져온다.

실무에서의 isolation level

Mysql

  • Sql 표준 isolation level 과 동일

oracle

Read Commited 그리고 Repeatable read, Serializable 모두 Serializable 로 통일하여 사용

SQL server

  • Sql 표준 isolation level 기반 + Snapshot

postgreSQL

  • Sql 표준 isolation level 과 동일, Serializtion Anomoaly 현상 추가
    , Repeatable read 가 Snapshot isolation leve에 해당

주요 RDBMS는 SQL 표준에 기반하여 isolation level 을 정의한다.
RDBMS마다 제공하는 isolation level 다르다.
같은 이름의 isoaltion level이라도 동작방식이 다를 수 있다.

사용하는 RDBMS의 isolation level을 잘 파악해서 적절하게 사용할 수 있도록 해야한다.

참고
https://www.youtube.com/watch?v=bLLarZTrebU&t=1742s
https://zzang9ha.tistory.com/381

0개의 댓글