[DB] 트랜잭션 동시성 제어

안녕하·2023년 12월 7일
0

데이터베이스

목록 보기
21/21

트랜잭션 동시성 제어

  • DBMS는 동시성을 지원
    • 여러 사용자가 DB를 동시에 접근할 수 있도록 여러 트랜잭션이 동시에 수행됨
    • 동시에 같은 데이터에 변경 연산을 수행하면 일관성 유지x
  • 트랜잭션 동시성 + 같은 데이터에 대한 일관성 유지를 위해 동시성 제어를 함

동시성 제어 문제점

  1. 갱신 손실
  2. 모순성
  3. 연쇄 복귀

1. 갱신 손실 lost update

  • 한 트랜잭션의 변경 연산 결과를 다른 트랜잭션이 덮어써 변경 연산이 무효화되는 것

  • T1의 X=1 → T2의 x=2 → T1 write → T2 write

    • T1의 변경 연산이 무효화

2. 모순성 inconsistency

  • 한 트랜잭션이 여러 개의 데이터 변경 연산 시, 일관성 없는 상태의 DB에서 데이터를 가져와 연산 → 모순된 결과 발생

  • 어떤 연산은 현재의 트랜잭션 실행 전 버전의 데이터, 어떤 연산은 다른 트랜잭션 실행 후 버전의 데이터를 가져오면 모순


3. 연쇄 복귀 cascading rollback

  • 트랜잭션 완료 전에 장애가 발생하여 rollback 연산 수행 시, 해당 트랜잭션 장애 발생 전에 변경한 데이터를 가져가 변경 연산을 실행한 다른 트랜잭션에도 rollback 연산을 연쇄적으로 실행해야 함

  • 장애가 난 트랜잭션이 rollback 실행하기 전, 다른 트랜잭션이 commit하면 rollback 연산을 할 수 없어 문제가 발생




트랜잭션 스케줄

  1. 직렬 스케줄
    • 인터리빙 x, 트랜잭션을 순차 실행
  1. 비직렬 스케줄
    • 인터리빙 o, 트랜잭션 동시 실행
  1. 직렬 가능 스케줄
    • 직렬 스케줄처럼 정확한 결과를 생성하는 비직렬 스케줄



동시성 제어 기법

  • 여러 트랜잭션이 동시에 실행되더라도 정확한 결과를 얻는 직렬 가능성을 보장함

  • 모든 트랜잭션이 따르면 직렬 가능성이 보장되는 규약 정의
    → 트랜잭션 스케줄이 직렬 가능한지 검사할 필요x

  • 동일한 데이터에 동시에 접근하지 못하도록 lock과 unlock 연산 이용




MySQL 엔진의 lock

  1. 글로벌 lock
  2. 메타 데이터 lock
  3. 네임드 lock

InnoDB 엔진의 lock

  • MySQL이 제공하는 lock과 별개로 스토리지 엔진 내부에서 레코드 기반의 잠금을 지원
  • lock 정보가 작은 공간으로 관리

  1. 레코드 lock
  2. 갭 lock
  3. 넥스트 키 lock

Record lock

  • InnoDB는 인덱스의 레코드를 잠금
    • 다른 DBMS는 레코드 자체를 잠금
    • 인덱스가 없더라도 내부적으로 자동 생성된 클러스터 인덱스 이용

Gap lock

  • 레코드 자체가 아니라 레코드와 인접한 레코드 사이의 간격만 잠금
  • 레코드와 레코드 사이에 새로운 레코드가 insert되는 것을 제어

Next key lock

  • record lock + gap lock

  • MySQL에서는 REPEATABLE READ 격리 수준을 사용

  • InnoDB의 gap lock과 next key lock은 레플리카 서버 실행 결과와 소스 서버 실행 결과가 동일함을 보장

  • gap lock과 next key lock은 데드락 + 트랜잭션 지연 종종 발생
    • 바이너리 로그 포맷을 ROW 형태로 만들어 줄여야 함



profile
세요

0개의 댓글