본문 바로가기

DB

데이터베이스(5)

트랜젝션

  • 데이터베이스 내에서 하나의 그룹으로 처리해야 하는 명령문들을 모아놓은 작업 단위 ex) 송금
    • 출금과 입금이 1번씩 발생하지만 은행에서는 송금 자체를 하나의 트랜잭션으로 봄
    • 출금, 입금을 하나의 그룹으로 봄

 

트랜젝션 특징 (ACID)

  • 원자성(Atomicity) : 트랜잭션은 DB에 모두 반영되거나, 전혀 반영되지 않아야 함(ALL-OR-Nothing 방식)
    • 올 커밋, 올 롤
    • 정상적으로 종료된 경우, 데이터 베이스 내의 연산 결과 모두 전부 반영
    • 중간에 장애가 발생한 경우, 처음 상태로 모두 되돌려 전부 취소
  • 일관성(Consistency) : 트랜잭션이 실행되기 전과 실행된 후의 데이터베이스는 일관성 있는 상태여야 함
    • 일관성 요구조건:A계좌 + B계좌 = 5000
    • 트랜잭션 작업 전후 에도 일관성 요구 조건이 유지되어야 함
  • 격리성(Isolation) : 둘 이상의 트랜잭션이 동시 실행되고 있을 때, 각각의 트랜잭션은 서로 간섭 없이 독립적으로 실행되야 함 → 동시성 제어를 통해 구현
    • 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것
    • 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음
  • 영속성(Durability) : 트랜잭션이 성공적으로 완료되었으면 결과는 영구적이어야 함
    • 시스템 장애, 손상, 전원 공급 장애 등의 상황이 발생하더라도 데이터는 안전하게 보존되어야 함

→데이터 안정성과 무결성을 보장하기 위해 ACID 트랜잭션 사용

 

트랜젝션 연산

  • Commit : 트랜잭션의 모든 연산이 성공적으로 수행됐을 때, 트랜잭션에서 수행한 모든 변경 내용이 영구적으로 데이터베이스에 반영하게 하는 연산
  • Rollback : 트랜잭션 도중 오류가 발생하거나 트랜잭션 내에서 일부 연산이 실패했을 때, 트랜잭션을 실패로 처리하고 이전 상태로 되돌리게 하는 연산

 

트랜젝션 상태

 

  • 활동 : 트랜잭션이 실행을 시작했거나 실행 중인 상태
  • 부분 완료 : 트랜잭션이 모든 연산을 성공적으로 수행하였고, Commit연산을 기다리고 있는 상태
  • 완료 : 트랜잭션이 성공적으로 완료되어 Commit연산을 수행한 상태
  • 실패 : 트랜잭션 내에서 오류가 발생하여 트랜잭션이 중단된 상태
  • 철회 : 트랜잭션 실행에 실패하여 Rollback연산을 수행한 상태

 

트랜잭션 격리 레벨

  • 동시에 DB에 접근할 때 그 접근을 어떻게 제어할지에 대한 설정
  • READ-UNCOMMITTED (커밋되지 않은 읽기)
    • 커밋 전의 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽는 것을 허용
    • 더티 리드 (Dirty Read) 발생 : 커밋 이전의 데이터를 보고있을 때, 트랜잭션이 롤백된다면 잘못된 데이터를 보고 있는 것
    • 더티 리드 (Dirty Read) : 특정 트랜잭션에 이해 데이터가 변경되었지만, 아직 커밋되지 않은 상황에서 다른 트랜잭션이 해당 변경 사항을 조회할 수 있는 문제
     
  • READ-COMMITTED (커밋된 읽기)
    • 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회 가능
    • 커밋되지 않은 데이터에 접근하지 않고, UNDO 영역의 데이터를 접근
    • UNDO 영역 : 데이터의 변경이 있을 경우, 이전의 데이터를 보관하는 곳
    • 더티 리드 해결
    • 반복 불가능한 조회 (Non-Repeatable Read, 논 리피터블 리드) 문제 : 하나의 트랜잭션 내에서는 동일한 셀렉트 쿼리를 날렸을 때 항상 같은 결과를 보장해야 하지만 그러지 못한 것
    • 반복 불가능한 조회 (Non-Repeatable Read) : 같은 트랜잭션 내에서 같은 데이터를 여러번 조회했을 때 읽어온 데이터가 다른 경우
  • REPETABLE-READ (반복 가능한 읽기)
    • 트랜잭션 범위 내에서 조회한 내용이 항상 동일함을 보장함
  • SERIALIZABLE (직렬화 가능)
    • 한 트랜잭션에서 사용하는 데이터를 트랜잭션이 끝날 때까지 다른 트랜잭션에서 접근 불가
      • 가장 엄격한 격리수준

아래로 내려갈수록 격리 수준은 높아지고 데이터 정합성이 높아져 성능은 낮아짐

데이터 정합성 : 데이터가 일관되고 정확한 상태를 유지하는 것

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

'DB' 카테고리의 다른 글

MySQL (2)  (0) 2024.07.18
MySQL (1)  (0) 2024.07.18
데이터베이스(4)  (0) 2024.05.13
데이터베이스(3)  (0) 2024.05.13
데이터베이스(2)  (0) 2024.05.09