230404 TIL #50 트랜잭션 / Transaction 총정리

김춘복·2023년 4월 4일
0

TIL : Today I Learned

목록 보기
50/543
post-custom-banner

230404 Today I Learned

실전 프로젝트 4일차. 프론트 코드 마무리를 하고 전체적으로 리팩토링을 실시했다. 그리고 앞으로 사용해야 할 인프라와 기술 스택에 대해 공부했다. 저녁엔 EC2를 jmeter로 테스트했는데 생각보다 잘 버텨서 놀라웠다. 오늘 TIL에는 트랜잭션의 개념에 대해 심도있게 정리해보려한다.


트랜잭션 / Transaction

DB에서 하나의 논리적인 작업을 수행하기 위한 작업의 단위.
여러개의 쿼리문이 포함될 수 있다. 모든 쿼리가 성공적으로 수행되면 DB에 영구적인 변경을 반영하고(커밋) 쿼리가 하나라도 실패한다면 모든 변경작업을 취소한다(롤백).
따라서 트랜잭션은 데이터의 일관성과 무결성을 보장할 수 있다.

트랜잭션의 성질 ACID

  • Atomicity: 원자성. 트랜잭션은 작업의 일부분이라도 실패하면 전체 작업이 취소된다. 모든 쿼리가 성공적으로 수행되어야 DB에 변경이 반영된다.

  • Consistency: 일관성. 트랜잭션 수행 전과 후에도 DB는 일관성을 유지해야 한다. 트랜잭션 전후에도 DB의 제약조건은 만족되어야 한다.

  • Isolation: 격리성. 트랜잭션은 다른 트랜잭션 작업에 영향받지않고 독립적으로 수행되어야한다. 여러 트랜잭션이 동시에 수행될 때 각각은 서로를 모르고 자신만 DB를 수정하는 것처럼 동작해야 한다.

  • Durability: 지속성. 트랜잭션이 성공적으로 수행된 후에는 영구적인 DB의 변경을 보장해야 한다. 시스템이 장애가 생겨도 영구적으로 저장된 데이터는 손실이 되지 않아야 한다.


트랜잭션의 상태(실행단계)

  • 활동(Active) : 트랜잭션이 실행중인 상태
  • 실패(Failed) : 트랜잭션 실행 중 오류가 발생해 작업이 실패한 상태
  • 부분 완료(Partially Committed): 모든 쿼리가 성공적으로 수행되었지만 아직 커밋되지 않은 상태.
  • 중단(Aborted): 트랜잭션이 롤백되어 중단된 상태.

트랜잭션 관련 문제

  • Dirty Read : 어떤 트랜잭션이 아직 커밋하지 않은 데이터를 다른 트랜잭션이 읽어들이는 현상. 데이터의 일관성이 깨질 수 있어 이를 방지하기 위해 격리수준을 만든다.
    READ UNCOMMITTED 격리 수준에서 발생 가능하다.

  • Non-Repeatable Read : 트랜잭션이 동일한 데이터를 두번 이상 실행할 때 결과값이 다른 문제. 트랜잭션동안 데이터가 변경될 경우 발생.
    READ COMMITTED 격리 수준에서 발생 가능하다.

  • Phantom Read : 트랜잭션에서 동일한 쿼리를 실행했을 때 이전에는 없던 새로운 레코드가 결과에 포함되는 현상. Non-Repeatable Read는 하나의 데이터에 대한 문제이고, Phantom Read는 결과 집합에 대한 문제.


격리수준(Isolation Level)

  • 여러개의 트랜잭션이 동시에 수행될 때 각각의 트랜잭션이 다른 트랜잭션의 변경 작업을 어느정도 까지 알아볼 수 있는지 결정.
    격리수준이 높을수록 DB의 일관성과 무결성을 보장. 하지만 동시성이 떨어지는 단점이 있다.

READ UNCOMMITTED

  • 다른 트랜잭션에서 커밋되지 않은 데이터 변경내용을 읽을 수 있다.
    Dirty Read 문제가 발생할 수 있다.
    가장 낮은 격리수준이기 때문에 동시성은 가장 높지만 일관성과 무결성은 보장 X.

READ COMMITTED

  • 트랜잭션에서 변경 내용이 커밋되어야 값을 읽을 수 있다.
    다른 트랜잭션에서 수정중인 데이터를 읽을 수 없다.
    Dirty Read 문제는 없지만, Non-Repeatable Read 문제가 발생할 수 있다.

REPEATABLE READ

  • 트랜잭션 내에서 같은 쿼리를 실행하면 항상 같은 결과가 반환되도록 보장한다.
    트랜잭션에서 읽은 데이터에 대해 공유잠금(shared lock)을 걸어 다른 트랜잭션에서 변경하지 못하도록 한다.
    일반적으로 동시성을 보장하면서 일관성과 무결성을 보장하기 위해 사용되는 격리수준이다.
    Phantom Read 문제가 발생할 수 있다.
    대용량 트랜잭션 처리 시 너무 많은 로우 락을 유발해 성능저하를 야기할 수 있다.

SERIALIZABLE

  • 최고 수준의 격리수준. 동시성이 제일 떨어지는 격리수준.
    한 트랜잭션이 완료될 때 까지 다른 트랜잭션에서 해당 데이터를 변경할 수 없다.
    모든 읽기와 쓰기 작업이 테이블 단위 락을 획득해 직렬화되어 실행된다.
    그래서 다른 트랜잭션에서는 해당 데이터에 대한 작업을 수행할 수 없으므로 동시성이 제한된다.
    Phantom Read, Non-Repeatable Read 문제는 없다. 거의 사용되진 않는다.
profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글