2025-08-20
오늘 배운 것
5.1 트랜잭션
- 트랜잭션 : 데이터의 정합성 보장
- 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용하는 현상이 발생하지 않게 만들어주는 기능
- 잠금 : 동시성 제어 기능
- 여러 커넥션에서 동시에 동일한 자원(레코드나 테이블)을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할
- 격리 수준
- 하나의 트랜잭션 내에서 또는 여러 트랜잭션 간의 작업 내용을 어떻게 공유하고 차단할 것인지를 결정하는 레벨
5.1.1 MySQL에서의 트랜잭션
- 트랜잭션 : 하나의 논리적인 작업 셋에 몇 개의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 100% 적용 되거나 아무것도 적용되지 않아야 함을 보장
- 부분 업데이트 : 논리적인 작업 셋에서 중간에 실패 했을 때 변경된 사항들이 롤백 되지 않은 것
- 실패한 쿼리로 인해 남은 레코드를 다시 삭제하는 재처리 작업이 필요
5.1.2 주의사항
- 트랜잭션은 DBMS 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는 것이 좋다.
- 특히 네트워크 작업이 있는 경우에는 반드시 트랜잭션에서 배제해야 한다.
5.2 MySQL 엔진의 잠금
- MySQL 잠금
- 스토리지 엔진 레벨
- MySQL 엔진 레벨
- 스토리지 엔진을 제외한 나머지 부분
- 모든 스토리지 엔진에 영향을 미침
- 종류
- 테이블락 : 테이블 데이터 동기화
- 메타데이터락 : 테이블의 구조를 잠금
- 네임드락 : 사용자의 필요에 맞게 사용가능한 잠금
5.2.1 글로벌 락
- MySQL에서 제공하는 잠금 가운데 가장 범위가 큼
- MySQL 서버 전체
- MyISAM이나 MEMORY 테이블에 대해 백업 할 때 사용
- 다른 세션에서 SELECT를 제외한 대부분의 DDL 문장이나 DML 문장을 실행하는 경우 글로벌 락이 해제될 때까지 해당 문장이 대기 상태
- InnoDB는 트랜잭션을 지원하기 때문에 일관된 데이터 상태를 위해 모든 데이터 변경작업을 멈출 필요 없음 → 가벼운 글로벌 락 필요 ⇒ 백업락 도입
- 백업락 : 백업 툴들의 안정적인 실행을 위한 잠금
- 특정 세션에서 백업락 획득 시 테이블 스키마나 사용자의 인증 관련 정보 변경 불가
- 데이터베이스 및 테이블 등 모든 객체 생성 및 변경 삭제
- REPAIR TABLE, OPTIMIZE TABLE 명령 (테이블 점검/복구/최적화시 사용)
- 사용자 관리 및 비밀번호 변경
- 일반적인 테이블의 데이터 변경은 허용
- 왜?
- MySQL 서버 구성 : 소스 서버 + 레플리카 서버
- 백업은 레플리카 서버에서 실행
- 데이터 변경까지 막으면 소스에 문제 발 생시 레플리카에 최신 변경사항을 다시 적용해야함 → 즉 변경사항 다 적용 될 때까지 백업 지연
- 그렇다고 잠금을 막으면 스키마 변경 시도시에 백업 실패함
- 따라서 백업락은 일반적인 테이블의 데이터 변경은 허용하되, 스키마나 사용자 인증 관련 정보는 변경 불가
5.2.2 테이블 락
- 개별 테이블 단위로 설정되는 잠금
- 명시적 :
LOCK TABLES table_name [READ | WRITE]
명령으로 특정 테이블의 락 획득
UNLOCK TABLES
명령으로 잠금 반납(해제) 가능
- 특별한 상황이 아니라면 애플리케이션에서 사용할 필요 거의 없음
- 묵시적
- InnoDB 테이블의 경우 스토리지 엔진 차원에서 레코드 기반의 잠금을 제공하기 때문에 단순 데이터 변경 쿼리로 인한 묵시적 테이블락이 설정되지 않음
- 더 정확히는 테이블 락이 설정되는 경우는 스키마를 변경하는 DDL의 경우에만 영향을 미침
5.2.3 네임드 락
GET_LOCK()
함수를 이용해 임의의 문자열에 대해 잠금을 설정
- 대상 : 테이블, 레코드 , AUTO_INCREMETN 같은 객체가 아닌 사용자가 지정한 문자열
- 사용 목적
- 여러 클라이언트가 상호 동기화를 처리해야할 때
- 많은 레코드에 대해서 복잡한 요건으로 레코드를 변경하는 트랜잭션
- 동일 데이터를 변경하거나 참조하는 프로그램끼리 분류해서 네임드 락을 걸고 쿼리를 실행하면 아주 간단히 해결 가능
5.2.4 메타데이터락
- 테이블이나 뷰 등의 데이터 베이스 객체의 이름이나 구조를 변경하는 경우에 획득하는 잠금
- 명시적으로 획득/해제 불가하고 테이블 이름 변경과 같은 쿼리 실행시 자동으로 획득