DB Transaction 트랜잭션

동민·2021년 3월 9일
0
  • 트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미

  • 하나의 트랜잭션은 Commit되거나 Rollback된다.


트랜잭션 ACID

  1. Atomicity(원자성)

    • 트랜잭션의 연산은 데이터베이스에 모두 반영되든지 아니면 전혀 반영되지 않아야 한다.
    • 트랜잭션 내의 모든 명령은 반드시 완벽히 수행되어야 하며, 모두가 완벽히 수행되지 않고 어느하나라도 오류가 발생하면 트랜잭션 전부가 취소되어야 한다.
  2. Consistency(일관성)

    • 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다.
    • 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 한다.
  3. Isolation(독립성,격리성) // CJmall과 같이 다수의 사용자가 동시에 트랜잭션을 요청하는 경우, DB 독립성에 대해 정합성이 보장되어야 한다.

    • 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션의 연산이 끼어들 수 없다.
    • 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.
  4. Durablility(영속성,지속성)

    • 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.

트랜잭션 격리 수준 Isolation Level]

  1. READ UNCOMMITTED

    • 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관 없이 다른 트랜잭션에서 값을 읽을 수 있다.
    • 아래와 같이 Commit이 되지 않는 상태지만 Update된 값을 다른 트랜잭션에서 읽을 수 있다.

    READ UNCOMMITTED 문제점

    • DIRTY READ 현상: 트랜잭션이 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상
  2. READ COMMITTED

    • RDB에서 대부분 기본적으로 사용되고 있는 격리 수준이다.

    • Dirty Read 현상 발생X

    • 실제 테이블 값을 가져오는 것이 아니라 Undo 영역에 백업된 레코드에서 값을 가져온다.

    READ COMMITTED 문제점

    • 트랜잭션-1이 Commit한 이후 아직 끝나지 않는 트랜잭션-2가 다시 테이블 값을 읽으면 값이 변경됨을 알 수 있다.
    • 하나의 트랜잭션내에서 똑같은 SELECT 쿼리를 실행했을 때는 항상 같은 결과를 가져와야 하는 REPEATABLE READ의 정합성에 어긋난다.
    • 데이터의 정합성은 깨지고, 버그를 찾기 어려워 짐
  3. REPEATABLE READ (MVCC, Multi Version Concurrency Control)

    • MySQL에서는 트랜잭션마다 트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽게 된다.
    • Undo 공간에 백업해두고 실제 레코드 값을 변경한다. (Undo에 백업된 레코드가 많아지면 MySQL 서버의 처리 성능이 떨어질 수 있음)
    • 백업된 데이터는 불필요하다고 판단하는 시점에 주기적으로 삭제한다.

    REPEATABLE READ 문제점

    • PHANTOM READ 현상: 다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안 보였다가 하는 현상
    • 이를 방지하기 위해서는 쓰기 잠금을 걸어야 한다.
  4. SERIALIZABLE

    • 가장 단순한 격리 수준이지만 가장 엄격한 격리 수준
    • 성능 측면에서는 동시 처리성능이 가장 낮다.
    • SERIALIZABLE에서는 PHANTOM READ가 발생하지 않지만, 거의 사용되지 않음
profile
BE Developer

0개의 댓글