동시성 제어 - Database Lock

귀찮Lee·2023년 2월 14일
0

DataBase / MySQL

목록 보기
4/16
post-thumbnail
post-custom-banner

원티드 프리온보딩 2월 "MySQL 잘 사용하기" 학습내용 2일차 - 2

◎ 동시성 제어

  • 동시성 제어

    • 하나의 데이터를 동시에 여러명이 조작할 수 없도록 방어함
    • 여러명이 같은 데이터를 요청할 경우, 한 시점에는 하나의 커넥션만 변경할 수 있도록 한다.
  • 동시성 제어가 안될 경우 발생할 수 있는 문제 예시

    우선 한 플레이어의 골드가 옮기려는 1000 골드 이상인지 확인 후 1000 골드를 차감한다. 그 후 받을 플레이어의 골드를 1000 증가시킨 후 트랜잭션을 커밋한다. 만약 커밋이나 롤백을 하기 전에 다른 프로세스가 플레이어 1번의 골드를 조회하는 경우 차감 전의 원래 골드 값을 돌려받아 버그가 생기게 된다.

◎ 동시성 제어 관련 버그 여러가지 유형

text

  • Temporary Update Problem
    • Partially Commited State에서 commit 되기 전에 read가 발생한 경우

    • Failed Stated에서 Aborted State로 rollback되기 전 read가 발생한 경우

  • Incorrect Summary Problem
    • aggregation을 시도하는 중 update가 발생하는 경우
    • 쉽게 이야기하자면 연산 중에 중간 값을 업데이트 하는 경우

  • Lost Update Problem
    • 하나의 transaction이 시도한 update를 다른 transaction이 덮어쓰는 것

  • Unrepeatable Read Problem

    • 여러개의 READ operation이 다른 결과를 낳는 것
    • 중간에 변경으로 인해 두 번의 READ operation이 다른 결과를 낳는 것

  • Phantom Read Problem

    • 한 번 READ를 시도하고 같은 값을 다시 READ를 시도하는 사이에 해당 값이 지워지는 경우

◎ MySQL에서 지원하는 Lock의 종류

  • Global Lock

    • 가장 넓은 범위로 데이터베이스 서버 전체에 영향을 미침
    • SELECT를 제외한 모든 쿼리들이 대기 상태로 남음
    • 일반적으로 사용하지 않지만 DB의 소프트웨어 버전을 올린다던지 주요한 DB의 업데이트에 사용함
  • Table Lock

    • 특정 테이블에 대한 lock
    • 테이블에 데이터를 변경하는 쿼리를 실행하면 자동으로 lock이 발생
      • DDL(create, alter, drop 등) 구문과 함께 사용되며 DDL Lock이라고도 한다.
    • 해당 명령어를 거이 사용할 일이 거이 없다.
  • Named Lock

    • GET_LOCK()이라는 명령어로 임의의 문자열에 대해 잠금을 설정
    • 자주 사용하지 않음
      • 여러 클라이언트가 상호 동기화를 처리해야할 때 사용할 수 있음
      • 많은 레코드에 대해 복잡한 요건으로 변경하는 트랜잭션에 유용함
  • Metadata Lock

    • 데이터베이스 객체의 이름이나 구조를 변경하는 경우에 획득
    • 테이블 락처럼 별도의 명령어를 사용할 수는 없고, 테이블을 변경하는 등의 작업을 할 때 자동으로 가져왔다가 release함
  • Record Lock

    • record / row 단위로 lock을 거는 것

◎ 참고 자료

profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!
post-custom-banner

0개의 댓글