[Real MySQL] 5. 트랜잭션과 잠금

@lim · September 07, 2024

1. 트랜잭션

  • 트랜잭션은 데이터베이스의 상태를 변화시키는 하나의 논리적 작업 단위
  • ACID(원자성, 일관성, 고립성, 지속성) 특성을 보장
  • 데이터의 일관성을 유지하고 안정적인 데이터 처리를 가능케 함

→ 부분 업데이트(Partial Update) 현상을 방지

잠금(Lock)과 트랜잭션

  • 잠금 : 동시성을 제어가 목적
  • 트랜잭션 : 데이터의 정합성을 보장이 목적

MySQL에서의 트랜잭션

  • 트랜잭션은 하나의 논리적은 작업 셋에 적용
  • Commit 되거나 Rollback 되어야 함

InnoDB와 MyISAM의 차이

InnoDB는 트랜잭션을 지원하지만 MyISAM과 MEMORY는 트랜잭션을 지원하지 않는다.

  • MyISAM : 오류 발생 시 일부 데이터가 남을 수 있음
  • InnoDB : 오류 발생 시 모든 변경사항이 ROLLBACK됨

트랜잭션 명령어

  • BEGIN, START TRANSACTION: 트랜잭션 시작
  • COMMIT: 트랜잭션 내의 모든 작업을 확정
  • ROLLBACK: 트랜잭션 내의 모든 작업을 취소
  • SAVEPOINT: 트랜잭션 내에 중간 저장점을 생성

Autocommit

MySQL은 Autocommit이 기본
각 쿼리가 자동으로 커밋되므로, 명시적인 트랜잭션 제어가 필요한 경우 비활성화

트랜잭션 사용 시 주의사항

  • 트랜잭션의 범위를 최소화해야함
  • 데이터베이스 커넥션과 트랜잭션의 사용 시간을 최소화 해야 함
  • 트랜잭션 내에서 외부 요청(ex. 메일 발송, 네트워크 통신)은 피해야 함

MySQL 잠금

MySQL 잠금의 종류

  • MySQL 엔진 레벨 잠금: 모든 스토리지 엔진에 영향을 미침
  • 스토리지 엔진 레벨 잠금: 해당 스토리지 엔진에만 영향을 미침

MySQL 엔진 레벨의 잠금

글로벌 락 (Global Lock)

가장 범위가 큰 잠금
FLUSH TABLES WITH READ LOCK 명령으로 획득
서버 전체에 영향을 미치며, 대부분의 DDL과 DML 작업은 대기
MySQL 8.0부터는 백업 락(LOCK INSTANCE FOR BACKUP)이 도입되어 더 가벼운 글로벌 락 제공

테이블 락 (Table Lock)

개별 테이블 단위의 잠금
명시적(LOCK TABLES) 또는 묵시적으로 획득 가능
InnoDB의 경우 대부분의 DML에서는 무시되고 DDL에만 영향

네임드 락 (Named Lock)

GET_LOCK() 함수를 이용해 임의의 문자열에 대해 잠금 설정
여러 클라이언트 간 상호 동기화에 유용
MySQL 8.0부터 중첩 사용 및 한 번에 모두 해제 가능

메타데이터 락 (Metadata Lock)

데이터베이스 객체의 이름이나 구조 변경 시 자동으로 획득
RENAME TABLE 등의 작업에서 사용됨

참고 내용

  • Real MySQL 8.0 1권 (백은빈, 이성욱)
@lim
기억은 기록기록