Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions docs/posts/database/lock.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ dateModified: 2025.09.28
---

# MySQL 엔진 레벨의 락 종류

락(Lock, 잠금)은 데이터베이스 공유 자원에 여러 커넥션이 동시 접근하는 경우 데이터의 일관성과 무결성을 유지하기 위해 사용되는 메커니즘입니다.<br />
MySQL에서의 락(Lock, 잠금)은 크게 MySQL 엔진 레벨의 락과 스토리지 엔진 레벨의 락으로 나눌 수 있습니다.<br />
**MySQL 엔진 레벨의 락**의 종류는 **글로벌 락, 메타데이터 락, 네임드 락, 메타데이터 락**이 있습니다.<br />
**MySQL 엔진 레벨의 락**의 종류는 **글로벌 락,테이블 락, 네임드 락, 메타데이터 락**이 있습니다.<br />

## 1. 글로벌 락(Global Lock)

글로벌 락은 MySQL에서 제공하는 락 중에 가장 범위가 가장 크며, MySQL 서버 전체에 영향을 미칩니다.<br />
한 세션에서 글로벌 락을 획득하면 다른 세션에서 SELECT를 제외한 DDL, DML문을 실행하는 경우 대기 상태가 됩니다.<br />

Expand All @@ -25,6 +27,7 @@ MyISAM이나 MEMORY 테이블에 `mysqldump`로 백업을 받는 경우 글로
`--single-transaction` 옵션을 사용하면 온라인 상태에서도 백업이 가능하고 글로벌 락을 사용할 필요가 없습니다.

## 2. 테이블 락(Table Lock)

테이블 락은 개별 테이블 단위로 설정되는 잠금이며, 명시적 또는 묵시적으로 락을 획득할 수 있습니다.<br />

명시적으로는 `LOCK TABLES tabled_name [ READ | WRITE ]` 명령으로 락을 획득할 수 있고, <br />
Expand All @@ -35,34 +38,38 @@ MyISAM이나 MEMORY 테이블에 `mysqldump`로 백업을 받는 경우 글로
InnoDB에서는 대부분의 DML 쿼리에서는 테이블 락이 무시되고 DDL에서만 영향을 미칩니다.

## 3. 네임드 락(Named Lock)

네임드 락은 `GET_LOCK()` 함수를 이용해 임의의 문자열에 대해 잠금을 설정할 수 있습니다.<br />
일반적인 테이블 락과 달리 특정 테이블이나 행에 종속되지 않습니다. <br />

- 네임드 락 획득: 다른 세션에 의해 잠금이 걸려있다면 최대 10초 동안 대기. 획득 성공 시 1, 실패 시 0 반환

```sql
SELECT GET_LOCK('mylock_1', 10);
SELECT GET_LOCK('mylock_1', 10);
```

- 네임드 락 해제: 성공 시 1, 실패 시 0, 오류 시 NULL 반환

```sql
SELECT RELEASE_LOCK('mylock_1');
SELECT RELEASE_LOCK('mylock_1');
```

- 네임드 락이 현재 사용 중인지 확인: 다른 세션에 의해 잠금이 걸려있다면 그 세션 ID 반환, 아니면 NULL 반환

```SQL
SELECT IS_USED_LOCK('mylock_1');
SELECT IS_USED_LOCK('mylock_1');
```

- 네임드 락이 자유로운지 확인: 어떤 세션에도 잡혀있지 않으면 1 반환, 이미 사용 중이면 0 반환

```sql
SELECT IS_FREE_LOCK('mylock_1');
SELECT IS_FREE_LOCK('mylock_1');
```

동일 이름의 락이 여러 세션에서 동시에 요청하면, 먼저 요청한 세션이 먼저 락을 획득합니다. <br />
예를 들어 배치 프로그램을 실행할 때 동시에 여러 웹서버에서 동일 데이터를 변경하고 참조하는 경우, 네임드 락을 걸고 쿼리를 실행하면 데드락을 방지할 수 있습니다.<br />


## 4. 메타데이터 락(Metadata Lock)

메타데이터 락은 데이터베이스 객체(테이블, 뷰 등)의 이름이나 구조를 변경하는 경우 획득하는 잠금입니다.<br />
명시적으로 획득하는 것이 아니라, `RENAME TABLE table_a TO table_b` 같이 테이블 이름을 변경하는 경우 자동으로 획득합니다.

2 changes: 1 addition & 1 deletion public/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"name": "디룩(Delook)",
"author": "@waterbinnn",
"homepage_url": "https://www.delook.co.kr/",
"version": "1.0.10",
"version": "1.0.11",
"description": "개념 학습부터 기술 면접 준비까지, 성장하는 개발자의 새 탭",
"action": {
"default_popup": "popup.html",
Expand Down