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권 (백은빈, 이성욱)