트랜잭션과 무결성

j·2024년 9월 3일
0

트랜잭션

  • DB에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
  • 즉 여러 개의 쿼리들을 하나로 묶는 단위를 말한다.
  • 트랜잭션의 특징은 원자성, 일관성, 독립성, 지속성이 있다. 이 특징을 묶어서 ACID 특징이라고 한다.

트랜잭션의 특징

1. 원자성

"all or nothing"

  • 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징이다.

  • 예를 들어 현재 홍철은 1000만원, 규영이에게 500만원을 이체하려는 상황이다.

    1. 홍철의 잔고를 조회한다.
    2. 홍철에게서 500만원을 뺀다.
    3. 규영에게 500만원을 넣는다.
  • 이 작업을 취소한다고 했을 때 홍철은 다시 1000만원, 규영이는 0원을 가져야 한다. 여기서 만일 3단계만 취소가 된다면 문제가 된다.

  • 그렇기 때문에 all or nothing 인 것이다.

  • 또 트랜잭션 단위로 여러 로직들을 묶을 때 외부 API를 호출하는 것이 있으면 안된다.

  • 커밋과 롤백

    • 커밋은 여러 쿼리가 성공적으로 처리됐다고 확정하는 명령어다.
    • '하나의 트랜잭션이 성공적으로 수행됐다' 라고도 한다.
    • 롤백은 트랜잭션으로 처리한 하나의 묶음 과정을 되돌리는, 취소하는 일을 말한다.
    • 커밋과 롤백 덕에 데이터의 무결성이 보장된다.

  • 트랜잭션 전파

    • 트랜잭션 수행할 때 커넥션 단위로 수행하기 때문에 커넥션 객체를 넘겨서 수행해야 한다.
    • 매번 커넥션 단위를 넘겨주는 것은 어렵고 귀찮은 일이다.
    • 이를 넘겨서 수행하지 않고 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 트랜잭션 전파라고 한다.
    • Spring에서 @Trancsactional이 여러 쿼리 관련 코드들을 하나의 트랜잭션으로 처리한다.

2. 일관성

  • 허용된 방식으로만 데이터를 변경해야 한다.
  • DB에 기록된 모든 데이터는 여러 조건, 규칙에 따라서 유효함을 가져야 한다.

3. 격리성

  • 트랜잭션 수행 시 서로 끼어들지 못하는 것을 말한다.

  • 복수의 병렬 트랜잭션을 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동되어야 한다.

  • 대신에 순차적으로 하나씩 실행되는 만큼 성능이 나쁠 수 있다.

  • 여러개의 격리 수준으로 나눠서 격리성을 보장한다.

    • 격리 수준
      1. SERIALIZABLE
        • 트랜잭션을 순차적으로 진행한다.
        • 여러 트랜잭션이 동시에 접근할 수 없다.
        • 매우 엄격해서 해당 해에 대해 격리 시키고 트랜잭션이 이 행에 대해 일어난다면 기다려야 한다.
        • 그렇기 때문에 교착 상태가 일어날 확룔도 높고 성능이 가장 떨어진다.

      2. REPEATABLE_READ
        • 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아준다.
        • 새로운 행을 추가할 수는 있다.
        • 조회를 할 때 새로운 행이 추가되어 발견될 수 있다.

      3. READ_COMMITTED
        • 가장 많이 사용되는 격리 수준이다.
        • MySQL8.0, PostrgreSQL, SQL Server, 오라클에서 기본 값.
        • READ_UNCOMMITTED와 다르게 다른 트랜잭션이 커밋하지 않은 정보는 못읽는다. (커밋 완료된 데이터에 대해서만 조회 허용)
        • 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정 할 수 있다.

      4. READ_UNCOMMITTED
        • 가장 낮은 격리 수준이다.
        • 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있다.
        • 속도가 가장 빠르다.
        • 무결성을 보장하려면 사용 안하는 것이 바람직하다.
        • 거대한 양의 데이터를 어림잡아 집계하는데 유리하다.

  • 격리 수준에 따라 발생하는 현상

    1. 팬텀 리드 (phantom read)

      • 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
    2. 반복 가능하지 않은 조회

      • 트랜잭션 내의 같은 행에 두 번 이상 조회했는데 그 값이 다른 경우
    3. 더티 리드

      • 반복 가능하지 않은 조회와 유사하다.
      • 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정 됐지만 아직 커밋이 안된 행의 데이터를 읽을 수 있는 격리 수준일 때 발생 한다.

    출처


    『면접을 위한 CS 전공지식 노트』

profile
개발 블로그

0개의 댓글