DevLog ๐Ÿ˜ถ

[Real MySQL 8.0] ํŠธ๋žœ์žญ์…˜๊ณผ MySQL / InnoDB์˜ ๋ฝ (Lock) ๋ณธ๋ฌธ

๐Ÿ“–/Real MySQL 8.0

[Real MySQL 8.0] ํŠธ๋žœ์žญ์…˜๊ณผ MySQL / InnoDB์˜ ๋ฝ (Lock)

dolmeng2 2023. 6. 18. 17:50

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๊ฐœ๋…๊ณผ, MySQL๊ณผ InnoDB ์Šคํ† ๋ฆฌ์ง€์—”์ง„์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฝ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.
 


 

๐ŸŒฑ ํŠธ๋žœ์žญ์…˜

ํŠธ๋žœ์žญ์…˜์€ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ์…‹์— ์™„์ „ํžˆ ์ ์šฉ(commit)๋˜๊ฑฐ๋‚˜, ์•„๋ฌด๊ฒƒ๋„ ์ ์šฉ๋˜์ง€ ์•Š์Œ (rollback)์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.
InnoDB์™€ MyISAM ํ…Œ์ด๋ธ”์€ ํŠธ๋žœ์žญ์…˜ ๊ด€์ ์—์„œ๋„ ์ฐจ์ด๋ฅผ ๋ณด์ด๋Š”๋ฐ, ์ด๋ฅผ ํ™•์ธํ•ด๋ณด์ž.
์šฐ์„ , ์•„๋ž˜์™€ ๊ฐ™์ด myISAM๊ณผ innoDB๋ฅผ ์‚ฌ์šฉํ•œ 2๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์ž.

CREATE TABLE tb_myisam (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=MYISAM;

CREATE TABLE tb_innodb (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=innodb;

 
๊ทธ๋ฆฌ๊ณ , ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ 1๊ฐœ์”ฉ ์ €์žฅํ•ด๋ณด์ž.

insert into tb_myisam (id) values (3);
insert into tb_innodb (id) values (3);

 
์ดํ›„, auto commit ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

๐Ÿ’ก AUTO COMMIT์ด๋ž€?
์‚ฌ์šฉ์ž๊ฐ€ commit ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ SQL๋ฌธ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด ์ž๋™์œผ๋กœ ์ปค๋ฐ‹์„, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ์•„์„œ ๋กค๋ฐฑ์„ ํ•ด์ค€๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ํ™œ์„ฑํ™”๊ฐ€ ๋˜์–ด ์žˆ๋‹ค.

 

set autocommit = on;

insert into tb_myisam (id) values (1), (2), (3);
insert into tb_innodb (id) values (1), (2), (3);

๋‹น์—ฐํžˆ primary key๋กœ ์„ค์ •๋œ ์ปฌ๋Ÿผ์— ๋™์ผํ•œ ๊ฐ’์„ ๋„ฃ์œผ๋ ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
 
ํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ select ํ–ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

tb_myisam
tb_innodb

 
myISAM์œผ๋กœ ์ƒ์„ฑํ•œ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ 1, 2, 3 ๋ชจ๋‘๊ฐ€ ๊ทธ๋Œ€๋กœ ์‚ฝ์ž…๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋Š”, ๋กค๋ฐฑ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค๊ธฐ๋ณด๋‹ค๋Š”, ์ฟผ๋ฆฌ๋ฌธ์—์„œ 1, 2๋Š” ์‚ฝ์ž… ์„ฑ๊ณตํ–ˆ์ง€๋งŒ 3์„ ์‚ฝ์ž…ํ•œ ์ˆœ๊ฐ„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ 3์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒํ•œ ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ฉด์—, innoDB์˜ ๊ฒฝ์šฐ ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์ƒ๊ฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ 1, 2, 3 ๋ชจ๋‘๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด์„œ ๋กค๋ฐฑ์„ ํ•œ๋‹ค.
์ด๋Ÿฐ ํ˜„์ƒ์„ 'Partial Update'๋ผ๊ณ  ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ๊ฒฝํ•ฉ์„ฑ์„ ๋งž์ถ”๋Š” ๋ฐ ์–ด๋ ค์›€์„ ์ฃผ๋Š” ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
์™œ innoDB๋ฅผ ๋งŽ์ด๋“ค ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ•œ ๊ฐ€์ง€ ์ด์œ ๋ฅผ ๋” ์•Œ์•„๊ฐ„๋‹ค ๐Ÿ˜Ž
 


 

๐ŸŒฑ ๋ฝ - MySQL

MySQL์—์„œ ๋ฝ์€ ํฌ๊ฒŒ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ๊ณผ MySQL ์—”์ง„ ๋ ˆ๋ฒจ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
MySQL ์—”์ง„ ๋ ˆ๋ฒจ์˜ ๋ฝ์€ ๊ธ€๋กœ๋ฒŒ ๋ฝ, ํ…Œ์ด๋ธ” ๋ฝ, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ, ๋„ค์ž„๋“œ ๋ฝ์„ ์ œ๊ณตํ•œ๋‹ค.
 
 

๐Ÿ’ฌ ๊ธ€๋กœ๋ฒŒ ๋ฝ

MySQL์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฝ ์ค‘์—์„œ ๊ฐ€์žฅ ๋ฒ”์œ„๊ฐ€ ํฐ ๋ฝ์ด๋‹ค.

FLUSH TABLES WITH READ LOCK

ํ•˜๋‚˜์˜ ์„ธ์…˜์—์„œ ๊ธ€๋กœ๋ฒŒ ๋ฝ์„ ํš๋“ํ•˜๋ฉด ๋‹ค๋ฅธ ์„ธ์…˜์—์„œ select๋ฅผ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ DDL / DML ๋ฌธ์žฅ ์‹คํ–‰ ์‹œ, ๊ธ€๋กœ๋ฒŒ ๋ฝ์ด ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋‚จ๊ฒŒ ๋œ๋‹ค. MySQL ์„œ๋ฒ„ ์ „์ฒด์— ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์—… ์ค‘์ธ ํ…Œ์ด๋ธ”์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋„˜์–ด์„œ ๋™์ผํ•˜๊ฒŒ ์˜ํ–ฅ์„ ์ค€๋‹ค.
 
๋งŒ์•ฝ, ๊ธ€๋กœ๋ฒŒ ๋ฝ์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ์“ฐ๊ธฐ ๋ฝ์ด ๊ฑธ๋ฆฐ SQL์ด ์‹คํ–‰๋๋‹ค๋ฉด, ๊ธฐ์กด์˜ ์“ฐ๊ธฐ ๋ฝ์ด ์™„์ „ํžˆ ํ•ด์ œ๋œ ์ดํ›„์— ๊ธ€๋กœ๋ฒŒ ๋ฝ์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ์ฟผ๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด์•ผ๋งŒ ๊ธ€๋กœ๋ฒŒ ๋ฝ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, MySQL 8.0๋ถ€ํ„ฐ Xtrabackup, Enterprise Backup ๊ฐ™์ด '๋ฐฑ์—… ๋ฝ'์ด๋ผ๋Š” ์กฐ๊ธˆ ๋” ๊ฐ€๋ฒผ์šด ๋ฝ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

# ๋ฐฑ์—… ๋ฝ
LOCK INSTANCE FOR BACKUP;

# ๋ฝ ํ•ด์ œ
UNLOCK INSTANCE;

 
๋ฐฑ์—… ๋ฝ์˜ ๊ฒฝ์šฐ ํŠน์ • ์„ธ์…˜์—์„œ ํš๋“ํ•˜๋ฉด ๋ชจ๋“  ์„ธ์…˜์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํ…Œ์ด๋ธ” ๋“ฑ, ๋ชจ๋“  ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐ ๋ณ€๊ฒฝ, ์‚ญ์ œ
- REPAIR TABLE / OPTIMIZE TABLE
- ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ

ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์€ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์˜ ๊ธ€๋กœ๋ฒŒ ๋ฝ๋ณด๋‹ค ํ™•์‹คํžˆ ์™„ํ™”๋œ ๋ฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ธฐ์กด์˜ ๊ธ€๋กœ๋ฒŒ ๋ฝ์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ๋ณต์ œ์šฉ ์„œ๋ฒ„ (๋ ˆํ”Œ๋ฆฌ์นด ์„œ๋ฒ„)์—์„œ ๋ฐ์ดํ„ฐ์˜ ๋ณต์ œ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๋„์ค‘์— ๊ธฐ์กด ์„œ๋ฒ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ๋‹ค๋ฉด ๋ฐฑ์—… ์—ญ์‹œ ๊ณ„์† ์ง€์—ฐ / ํ˜น์€ ์‹คํŒจํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ๋ฐฑ์—…์ด๋ผ๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจ ์‹œ์— ๋˜ ๋‹ค์‹œ ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์„ ๋“ค์—ฌ์•ผ ํ•˜๊ณ , ๊ทธ๋Ÿฌ๋ฉด ์„œ๋น„์Šค ์ž์ฒด์—๋„ ์˜ํ–ฅ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ '๋ฐฑ์—… ๋ฝ'์ด๋ผ๋Š” ๊ฒƒ์ด ๋„์ž…๋˜์—ˆ๋‹ค.
 


 

๐Ÿ’ฌ ํ…Œ์ด๋ธ” ๋ฝ

ํ…Œ์ด๋ธ” ๋ฝ์˜ ๊ฒฝ์šฐ ํ…Œ์ด๋ธ” ๋‹จ์œ„๋กœ ์„ค์ •ํ•˜๋Š” ์ž ๊ธˆ์ด๋ฉฐ, ๋ช…์‹œ์  (explicit) / ์•”์‹œ์  (implicit) ๋ฝ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.

# ๋ฝ ํš๋“
LOCK TABLES table_name [READ | WRITE]

# ๋ฝ ํ•ด์ œ
UNLOCK TABLES

 
๋ฝ์„ ํš๋“ํ•  ๋•Œ 2๊ฐœ์˜ ์˜ต์…˜์„ ์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ•˜๋‚˜๋Š” READ, ํ•˜๋‚˜๋Š” WRITE์ด๋‹ค.

READ
- ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๋ฝ ํš๋“
- ๋‹ค๋ฅธ ์„ธ์…˜์ด ๋™์‹œ์— ๊ฐ™์€ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๋ฝ ํš๋“ ๊ฐ€๋Šฅ
- ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆ˜์ •์€ ๋ถˆ๊ฐ€๋Šฅ 
- ๋™์‹œ์— ๋‹ค๋ฅธ ์„ธ์…˜์ด ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ ์“ฐ๊ธฐ ๋ฝ ํš๋“ ๋ถˆ๊ฐ€๋Šฅ

WRITE
- ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๋ฝ ํš๋“ 
- ๋‹ค๋ฅธ ์„ธ์…˜์ด ๋™์‹œ์— ๊ฐ™์€ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๋ฝ, ์“ฐ๊ธฐ ๋ฝ ํš๋“ ๋ถˆ๊ฐ€๋Šฅ
- ์“ฐ๊ธฐ ๋ฝ์„ ํš๋“ํ•œ ์„ธ์…˜์€ ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์„ ์ฝ๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ

 
๋ช…์‹œ์  ๋ฝ์˜ ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ์ง์ ‘์ ์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฉฐ, ๋ฌต์‹œ์  ๋ฝ์˜ ๊ฒฝ์šฐ ํ…Œ์ด๋ธ”์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ MySQL ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋ฝ์„ ์„ค์ •ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ, ๋ฐ”๋กœ ๋ฝ์„ ํ•ด์ œํ•˜๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ž๋™์œผ๋กœ ํ• ๋‹น ๋ฐ ํ•ด์ œ๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜์ง€๋งŒ, innoDB์˜ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ๋ฝ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ” ๋ฝ์ด ์‹คํ–‰๋˜๋”๋ผ๋„ DML์—์„œ๋Š” ๋ฌด์‹œ๋˜๊ณ , DDL์—์„œ๋งŒ ์˜ํ–ฅ์„ ์ค€๋‹ค.
 


 

๐Ÿ’ฌ ๋„ค์ž„๋“œ ๋ฝ

ํ…Œ์ด๋ธ”, ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ž„์˜์˜ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์ž ๊ธˆ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ผ์ข…์˜ ๋ณ€์ˆ˜ ๋Š๋‚Œ?)
1๋Œ€์˜ DB ์„œ๋ฒ„์— ์—ฌ๋Ÿฌ ๋Œ€์˜ ์›น ์„œ๋ฒ„๊ฐ€ ์ ‘์†ํ•˜์˜€์„ ๋•Œ ํŠน์ • ์ •๋ณด๋ฅผ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋„ค์ž„๋“œ๋ฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# hello๋ผ๋Š” ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด์„œ ์ž ๊ธˆ ํš๋“
# ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด 2์ดˆ ๋Œ€๊ธฐ ํ›„ ํ•ด์ œ
SELECT GET LOCK('hello', 2);

# ์ž ๊ธˆ์ด ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ
SELECT IS_FREE_LOCK('hello');

# hello๋ผ๋Š” ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ํš๋“ํ–ˆ๋˜ ์ž ๊ธˆ ํ•ด์ œ
SELECT RELEASE_LOCK('hello');

3๊ฐ€์ง€ ์ฟผ๋ฆฌ ๋ชจ๋‘ select๋ฌธ์˜ ๊ฒฐ๊ณผ๋กœ ๋ฝ์„ ์ •์ƒ์ ์œผ๋กœ ํš๋“ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•˜๋ฉด 1์„, ์•„๋‹ˆ๋ผ๋ฉด null์ด๋‚˜ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
 

# ๋™์‹œ์— ๋ฝ ๊ฑธ๊ธฐ
SELECT GET_LOCK('hello1', 10);
SELECT GET_LOCK('hello2', 10);

# ๋ชจ๋‘ ํ•ด์ œ
SELECT RELEASE_ALL_LOCKS();

๋„ค์ž„๋“œ ๋ฝ์˜ ๊ฒฝ์šฐ ๋ณต์žกํ•œ ์กฐ๊ฑด์œผ๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋งŽ์ด ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, MySQL 8.0๋ถ€ํ„ฐ๋Š” ๋„ค์ž„๋“œ ๋ฝ์„ ์ค‘์ฒฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.
 


 
๐Ÿ’ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ

ํ…Œ์ด๋ธ”์ด๋‚˜ ๋ทฐ์˜ ์ด๋ฆ„์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ์„ ํš๋“ํ•œ๋‹ค. 
๋ช…์‹œ์ ์œผ๋กœ ํš๋“ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œ๊ฐ€ ์•ˆ ๋˜๋ฉฐ RENAME ๋“ฑ์˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ž๋™์œผ๋กœ ํš๋“ํ•˜๋Š” ์ž ๊ธˆ์ด๋‹ค.

# ์ด๋Ÿฌ๋ฉด tb_1, tb_2 ๋ชจ๋‘์— ๋Œ€ํ•ด์„œ ์ž ๊ธˆ์„ ์„ค์ •ํ•œ๋‹ค
RENAME TABLE tb_1 TO tb_2;

 
ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•  ๋•Œ ํ˜น์‹œ๋‚˜ ์‹ค์„œ๋น„์Šค์—์„œ 'ํ•ด๋‹นํ•˜๋Š” ํ…Œ์ด๋ธ”์ด ์—†์Šต๋‹ˆ๋‹ค' ๊ฐ™์€ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ํ•˜๋‚˜์˜ rename table ์ฟผ๋ฆฌ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์กฐ๊ฑด์„ ๋„ฃ์–ด๋‘๋ฉด ๋œ๋‹ค.

RENAME TABLE tb_1 to tb_2, tb_3 to tb_1

์ด๋ ‡๊ฒŒ ๋˜๋ฉด tb_1์— ๋Œ€ํ•ด์„œ๋Š” tb_2๋กœ ๋ฐ”๊พธ๋ฉด์„œ, ๊ธฐ์กด์˜ tb_3์„ tb_1์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ”๋กœ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค.
 
 

๐Ÿ’ก ํ…Œ์ด๋ธ” ๋ฝ + ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ 

๋กœ๊ทธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋กœ๊ทธ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์ž์˜ ์›น ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— INSERT๋งŒ ์ง„ํ–‰๋˜๋Š” ํ…Œ์ด๋ธ”์ด๋‹ค. ํ•˜์ง€๋งŒ, ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?
๊ธฐ๋ณธ์ ์œผ๋กœ MySQL์˜ DDL์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ด๋‹ค. 
๋ณดํ†ต ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ๋น„๊ต์  ์ตœ๊ทผ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  PK๋กœ ๋ฒ”์œ„๋ฅผ ๋‚˜๋ˆˆ ๋ ˆ์ฝ”๋“œ๋“ค์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค.

INSERT INTO tb_new SELECT * FROM tb_origin WHERE id >= 0 AND id <= 10000;

 
๊ทธ๋ฆฌ๊ณ , ๋‚จ์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ์–‘์ด ์ ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•ด์ง€๋ฉฐ, ๋น„๊ต์  ์„œ๋น„์Šค์— ๋œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋œ๋‹ค.

# auto commit ๋ชจ๋“œ ๋„๊ธฐ
SET autocommit = 0;

# ๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ ์“ฐ๊ธฐ ๋ฝ ํš๋“ (ํ…Œ์ด๋ธ” ๋ฝ)
LOCK TABLES tb_origin WRITE, tb_new WRITE;

# ๋‚จ์•„์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ด์ฃผ๊ธฐ
SELECT MAX(id) AS @max_id FROM tb_new;
INSERT INTO tb_new SELECT * FROM tb_origin WHERE id > @max_id;
COMMIT;

# ๋ณต์‚ฌ ์™„๋ฃŒ ์‹œ rename ์ง„ํ–‰ (๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ)
RENAME TABLE tb_origin TO tb_origin_old, tb_new to tb_origin;

# ์ž„์‹œ ํ…Œ์ด๋ธ” ์‚ญ์ œ
DROP TABLE tb_origin_old

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ…Œ์ด๋ธ” ๋ฝ์˜ ๊ฒฝ์šฐ 20000~20100๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ๋งŒ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ tb_new๋กœ ๋ณต์‚ฌํ•  ๋•Œ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ด๋‘ฌ์•ผ ๋ฝ์„ ์ ์œ ํ•˜๋Š” ์‹œ๊ฐ„์ด ์งง์•„์ง„๋‹ค.
 


 

๐ŸŒฑ ๋ฝ - innoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„

innoDB์—์„œ๋Š” MySQL์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฝ๊ณผ๋Š” ๋ณ„๋„๋กœ ๋ฝ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ information_schema ํ…Œ์ด๋ธ”์˜ INNODB_TRX, INNODB_LOCKS, INNODB_LOCK_WAITS ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ์ •๋ณด๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์ด ๋ฝ์„ ์ ์œ ํ•˜๊ณ  ๋Œ€๊ธฐ ์ค‘์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ๋ฒ•๋“ค์„ ํ†ตํ•ด์„œ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฝ๊นŒ์ง€ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๊ณ  ์žˆ๋‹ค.
 
innoDB์—์„œ๋Š” ์ด 8๊ฐ€์ง€์˜ ๋ฝ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

- Shared / Exclusive Lock
- Intention Lock
- Record Lock
- Gap Lock
- Next-Key Lock
- Insert Intention Lock
- Auto-increment Lock
- Predicate Lock for Spatial Indexes

 


 
 

๐Ÿ’ฌ Shared / Exclusive Lock (๊ณต์œ  ๋ฝ, ๋ฒ ํƒ€ ๋ฝ)

๊ณต์œ  ๋ฝ(S-Lock)๊ณผ ๋ฐฐํƒ€ ๋ฝ(X-Lock)์ด๋ผ๋Š” ๋ ˆ์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ ๋ฝ์ด๋ฉฐ, ๊ณต์œ  ๋ฝ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฝ์„ ๋ณด์œ ํ•œ ํŠธ๋žœ์žญ์…˜์ด ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ , ๋ฐฐํƒ€ ๋ฝ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์ž ๊ธˆ์„ ๋ณด์œ ํ•œ ํŠธ๋žœ์žญ์…˜์ด ํ–‰์„ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
 
์•ž์„œ ๋งํ–ˆ๋˜ ํ…Œ์ด๋ธ” ๋ฝ์˜ READ / WRITE ๋ชจ๋“œ์™€ ๊ฑฐ์˜ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
ํŠธ๋žœ์žญ์…˜ A๊ฐ€ S-Lock์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ ํŠธ๋žœ์žญ์…˜ B๋Š” S-Lock์„ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŠธ๋žœ์žญ์…˜ A๊ฐ€ X-Lock์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์–ด๋–ค ๋ฝ ์š”์ฒญ์ด๋“  ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค.
 


 

๐Ÿ’ฌ Intention Lock (์˜๋„ ๋ฝ)

์˜๋„ ๋ฝ(Intention Lock)์˜ ๊ฒฝ์šฐ ํ…Œ์ด๋ธ” ๋ฝ๊ณผ ๋ ˆ์ฝ”๋“œ ๋ฝ์ด ๊ณต์กดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค.
ํ…Œ์ด๋ธ”์˜ ํŠน์ • ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์ถ”ํ›„ ๋ฝ์„ ๊ฑธ๊ฒ ๋‹ค๊ณ  ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
๋งŒ์•ฝ WRITE ๋ชจ๋“œ์˜ ํ…Œ์ด๋ธ” ๋ฝ์„ ๊ฑธ์—ˆ๋‹ค๋ฉด, innoDB์—์„œ๋Š” 2๊ฐ€์ง€์˜ ํƒ€์ž…์œผ๋กœ ์˜๋„ ๋ฝ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Intention Shared Lock (IS)
- ํŠธ๋žœ์žญ์…˜์ด ํ…Œ์ด๋ธ”์˜ ๊ฐœ๋ณ„ ๋ ˆ์ฝ”๋“œ์— ๊ณต์œ  ๋ฝ ์„ค์ •

Intention Exclusive Lock (IX)
- ํŠธ๋žœ์žญ์…˜์ด ํ…Œ์ด๋ธ”์˜ ๊ฐœ๋ณ„ ๋ ˆ์ฝ”๋“œ์— ๋ฒ ํƒ€ ๋ฝ ์„ค์ •

 
๋งŒ์•ฝ SELECT ... LOCK IN SHARE MODE์„ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ ๋จผ์ € IS ์ด์ƒ์˜ ๋ฝ์„ ๊ฑธ๊ณ , ๊ทธ ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ S-Lock์ด ๊ฑธ๋ฆฌ๋ฉฐ, SELECT ... FOR UPDATE์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ ๋จผ์ € IX ์ด์ƒ์˜ ๋ฝ์„ ๊ฑธ๊ณ , ๊ทธ ๋‹ค์Œ์— ๋ ˆ์ฝ”๋“œ์— X-Lock์ด ๊ฑธ๋ฆฐ๋‹ค. ์™œ ์ด๋ ‡๊ฒŒ 2๋ฒˆ ๊ฑฐ๋Š” ๊ฒƒ์ผ๊นŒ?
- ์ด๋Š”, ํŠธ๋žœ์žญ์…˜ A์—์„œ ์ด๋ฏธ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ๋ฝ์„ ๊ฑธ์–ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ์— ์ ‘๊ทผํ•˜์—ฌ ๋ฝ์„ ๊ฑธ์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ์“ฐ๊ธฐ ์ž‘์—… ์‹œ ์ด๋ฏธ IX ๋ฝ์ด ๊ฑธ๋ ค ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ๋ฉ‹๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๊ฐ€ ์—†๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
 
์•„๋ž˜๋Š” ๋ฝ ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ ์ ‘๊ทผ ์‹œ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ํ‘œ์ด๋‹ค.
 

 SISXIX
Sํ˜ธํ™˜ ๊ฐ€๋Šฅํ˜ธํ™˜ ๊ฐ€๋Šฅ์ถฉ๋Œ์ถฉ๋Œ
ISํ˜ธํ™˜ ๊ฐ€๋Šฅํ˜ธํ™˜ ๊ฐ€๋Šฅ์ถฉ๋Œํ˜ธํ™˜ ๊ฐ€๋Šฅ
X์ถฉ๋Œ์ถฉ๋Œ์ถฉ๋Œ์ถฉ๋Œ
IX์ถฉ๋Œํ˜ธํ™˜ ๊ฐ€๋Šฅ์ถฉ๋Œํ˜ธํ™˜ ๊ฐ€๋Šฅ

๊ธฐ๋ณธ์ ์œผ๋กœ ํ‘œ๋ฅผ ๋ณด๋ฉด IS์˜ ๊ฒฝ์šฐ X, IX์˜ ๊ฒฝ์šฐ S, X์„ ์ œ์™ธํ•˜๊ณ  ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์—์„œ ๋™์‹œ์— ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
 


 

๐Ÿ’ฌ Record Lock (๋ ˆ์ฝ”๋“œ ๋ฝ)

๋ ˆ์ฝ”๋“œ ๋ฝ์˜ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์ž ๊ธˆ์„ ๊ฑฐ๋Š” ๊ฒƒ์ด๋‹ค.
innoDB์˜ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ ์ž์ฒด๋ฅผ ์ž ๊ทธ๋Š” ๊ฒƒ๋ณด๋‹ค๋Š”, ์ธ๋ฑ์Šค์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทผ๋‹ค. ํ•˜์ง€๋งŒ, ์ธ๋ฑ์Šค๊ฐ€ ์—†๋”๋ผ๋„ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑํ•ด์คฌ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ์—ฌ๊ธฐ์„œ๋„ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๋ฑ์Šค๋ฅผ ์•Œ์•„์„œ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฅผ ๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ์— ์‚ฌ์šฉํ•œ๋‹ค.

# id = 1์ธ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด S-Lock
SELECT id FROM tb_1 WHERE id = 1 LOCK IN SHARE MODE;

# id = 1์ธ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด X-Lock
SELECT id FROM tb_1 WHERE id = 1 FOR UPDATE;

 
๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ธ๋ฑ์Šค์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ฝ์„ ๊ฑฐ๋Š” ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

- innoDB์˜ B+ Tree ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ธ๋ฑ์Šค์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ํŠน์ • ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ํ•„์š”ํ•˜๋‹ค.

- ๋˜ํ•œ, ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฝ์„ ๊ฑธ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜๋“ค์ด ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ ์ž์ฒด์—๋„ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 


 

๐Ÿ’ฌ Gap Lock (๊ฐญ ๋ฝ)

๊ฐญ ๋ฝ์˜ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋ ˆ์ฝ”๋“œ์™€ ์ธ์ ‘ํ•œ ๋‹ค๋ฅธ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ทธ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋•Œ, ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ๋ ˆ์ฝ”๋“œ ์•ž(Negative Infinity) ๋’ค(Positive Infinity)์— ๊ฐ€์ƒ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ€์ƒ ๋ ˆ์ฝ”๋“œ๋ฅผ 'Supremum' ๊ฐ€์ƒ ๋ ˆ์ฝ”๋“œ๋ผ๊ณ  ํ•œ๋‹ค.
 
๊ฐญ ๋ฝ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฆฌํ„ด๋˜๋„๋ก ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, Phantom Read๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด๋Š” ๊ฐญ ๋ฝ์ด ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์— ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์‚ฝ์ž…๋˜๋Š” ๊ฒƒ์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

select * from tb_1 where id between 1 and 10;

์œ„์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ์„ ๋•Œ 1~10 ์‚ฌ์ด์— X๋ฝ์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฝ์ž…๋˜๋ ค๋ฉด ๋Œ€๊ธฐํ•ด์•ผ ๋œ๋‹ค.
 
๋˜ํ•œ, ๋™์ผํ•œ ๊ฐญ์— ๋Œ€ํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ถฉ๋Œํ•˜๋Š” ๋ฝ์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. ์ฆ‰, ํŠธ๋žœ์žญ์…˜ A๊ฐ€ Gap S-Lock์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ๋™์ผํ•œ ๊ฐญ์— ๋Œ€ํ•ด์„œ Gap X-Lock์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํŠน์ • ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์„ ๋•Œ ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์— ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๊ฐญ ๋ฝ์„ ๋ณ‘ํ•ฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ์ด ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
 

๐Ÿ’ก Where ์ ˆ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜์ผ ๋•Œ, Record vs Gap ์ค‘ ์–ด๋–ค ๋ฝ์ด ์‚ฌ์šฉ๋ ๊นŒ?
- ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปฌ๋Ÿผ์— unique index๊ฐ€ ๊ฑธ๋ ค ์žˆ๋‹ค๋ฉด record lock์ด ์‚ฌ์šฉ๋œ๋‹ค.
- ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜, unique ํ•˜์ง€ ์•Š์€ index๋ผ๋ฉด gap lock์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
: ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์Šค์บ”ํ•œ ์ธ๋ฑ์Šค ๋ฒ”์œ„์— ๋Œ€ํ•ด gap lock์ด ์ ์šฉ๋˜๊ณ , ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค๋ฉด ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ์Šค์บ”ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ๋ฝ์ด ๊ฑธ๋ฆฐ๋‹ค.

 


 

๐Ÿ’ฌ Next-Key Lock (๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ)

๋ ˆ์ฝ”๋“œ ๋ฝ๊ณผ ๊ฐญ ๋ฝ์„ ํ•ฉ์นœ ํ˜•ํƒœ๋ฅผ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์ด๋ผ๊ณ  ํ•œ๋‹ค.
innoDB์—์„œ๋Š” ํ…Œ์ด๋ธ” ์ธ๋ฑ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์Šค์บ”ํ•  ๋•Œ ์‹ค์ œ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด S / X-Lock์„ ์„ค์ •ํ•˜์—ฌ ๋ ˆ์ฝ”๋“œ ๋‹จ์œ„ ๋ฝ์„ ๊ฑธ๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์ด์ „์˜ ๊ฐญ์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์„ธ์…˜์ด ํŠน์ • ๋ ˆ์ฝ”๋“œ 1๋ฒˆ์— S / X-Lock์„ ๊ฑธ๋ฉด ๋‹ค๋ฅธ ์„ธ์…˜์€ 1๋ฒˆ ๋ฐ”๋กœ ์•ž์˜ ๊ฐญ์— ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.
 

์˜ˆ๋ฅผ ๋“ค์–ด, 10, 11, 13, 20์— ์ธ๋ฑ์Šค๊ฐ€ ๊ฑธ๋ ค ์žˆ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ๊ฐ„์—์„œ ๋ฝ์ด ์ƒ์„ฑ๋œ๋‹ค.
- (Negative infinity, 10]
- (10, 11]
- (11, 13]
- (13, 20]
- (20, Positive infinity)

 
์ž˜ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ, ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž. ์•„๋ž˜๋Š” crew ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด id๊ฐ€ 100 ์ด์ƒ์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค.

SELECT * FROM crew WHERE id > 100 FOR UPDATE;

์ด๋•Œ, id > 100์„ ๋งŒ์กฑํ•˜๋Š” id = 101์ธ ๋ฆฌ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ ์ง์ „์˜ ๋ ˆ์ฝ”๋“œ์™€ ๊ทธ ์‚ฌ์ด ๋ฝ์ด ๊ฑธ๋ฆฐ๋‹ค. (50 ~ 101 ์‚ฌ์ด ๊ฐญ ๋ฝ)
์ดํ›„, id > 100์„ ๋งŒ์กฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋„ ๊ฐญ ๋ฝ๊ณผ ๋ ˆ์ฝ”๋“œ ๋ฝ์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋˜๋ฉฐ, ์ด๋•Œ id = 150์ด ์ตœ๋Œ€์ด๊ธฐ ๋•Œ๋ฌธ์— Positive Infinity Gap Lock์ด ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.
 
๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์˜ ๊ฒฝ์šฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๊ฐ€ ๊ธฐ๋ก๋˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋ ˆํ”Œ๋ฆฌ์นด ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ๋•Œ, ๊ธฐ์กด ์„œ๋ฒ„์—์„œ ๋งŒ๋“ค์–ด๋‚ธ ๊ฒฐ๊ณผ์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ์ฃผ ๋ชฉ์ ์ด๋‹ค. ๋กœ๊ทธ ํฌ๋งท์˜ ๊ฒฝ์šฐ statement, row, mixed๋กœ ๋‚˜๋ˆ„์–ด์ง€๋Š”๋ฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.
 
- statement: ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํฌ๋งท, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฅผ ์ €์žฅ
- row : ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊ธฐ๋ก
- mixed: statement + row๋ฅผ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
 
๊ธฐ์กด์—๋Š” statement ํฌ๋งท์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณดํŽธ์ ์ด์—ˆ์œผ๋‚˜, ์ด ๊ฒฝ์šฐ repeatable-read ์ด์ƒ์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ๊ณผ (read-committed ์‚ฌ์šฉ ์‹œ ์‹คํ–‰ ์‹œ์ ๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์–ด์„œ) ์ฟผ๋ฆฌ์˜ ์‹คํ–‰๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ (์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜, ํ”„๋กœ์‹œ์ € ์‚ฌ์šฉ ๋“ฑ) ํ•ด๋‹น ์ฟผ๋ฆฌ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ, ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ๊ณผ ๊ฐญ ๋ฝ์œผ๋กœ ์ธํ•ด ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ํฌ๋งท์„ ROW ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์„œ ๋ฝ ์ž์ฒด๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. (MySQL 8.0๋ถ€ํ„ฐ๋Š” ROW ํฌ๋งท์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๊ฐ€ ๊ธฐ๋ณธ์ด๋‹ค.)
 


 

๐Ÿ’ฌ Insert Intention Lock (์‚ฝ์ž… ์˜๋„ ๋ฝ)

์‚ฝ์ž… ์˜๋„ ๋ฝ์€ INSERT ๊ตฌ๋ฌธ์ด ์‹คํ–‰๋  ๋•Œ ๋ฌต์‹œ์ ์œผ๋กœ ์„ค์ •๋˜๋Š” ์ผ์ข…์˜ ๊ฐญ ๋ฝ์ด๋‹ค.
์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์ด ๊ฐญ ๋‚ด๋ถ€์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์— ์‚ฝ์ž…์„ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋Œ€๊ธฐ ์—†์ด ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฝ์ž… ์˜๋„ ๋ฝ๋“ค๋ผ๋ฆฌ๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
 
๋งŒ์•ฝ id = 3, 7์ธ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ํŠธ๋žœ์žญ์…˜ A๋Š” id = 5๋ฅผ, ํŠธ๋žœ์žญ์…˜ B๋Š” id = 4์„ ์‚ฝ์ž…ํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž.

๊ธฐ๋ณธ์ ์ธ ๊ฐญ ๋ฝ์„ ๊ฑธ์—ˆ๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜ A๊ฐ€ 5๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด์ „ ๋ ˆ์ฝ”๋“œ์ธ 3 ~ 5 ์‚ฌ์ด์— ๊ฐญ ๋ฝ์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋‹ค. ์ด๋•Œ, ํŠธ๋žœ์žญ์…˜ B๊ฐ€ id = 4์„ ์‚ฝ์ž…ํ•˜๋ ค๊ณ  ํ–ˆ์„ ๋•Œ ์ด๋ฏธ 3~5 ์‚ฌ์ด์— ๊ฐญ๋ฝ์ด ๊ฑธ๋ ค ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ด์„œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์กด์žฌํ•œ๋‹ค.
 
๋ฐ˜๋ฉด์—, ์‚ฝ์ž… ์˜๋„ ๋ฝ์„ ๊ฑธ์—ˆ๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜ A๊ฐ€ 5๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณผ์ •์—์„œ 3 ~ 5 ์‚ฌ์ด์— ์‚ฝ์ž… ์˜๋„ ๋ฝ์ด ๊ฑธ๋ฆฐ๋‹ค. ์ด๋•Œ, ํŠธ๋žœ์žญ์…˜ B๊ฐ€ id = 4๋ฅผ ์‚ฝ์ž…ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‚ฝ์ž… ์˜๋„ ๋ฝ์€ ์ถฉ๋Œ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์ด ๋ฐ”๋กœ ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
 
์‚ฝ์ž…์„ ์œ„ํ•œ X-Lock์„ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฝ์ž… ์˜๋„ ๋ฝ์„ ํ†ตํ•ด์„œ ๋ฌต์‹œ์ ์œผ๋กœ ๋ฝ์„ ๊ฑธ์–ด๋‘๊ฒŒ ๋œ๋‹ค.
 


 

๐Ÿ’ฌ Auto-increment Lock (์ž๋™ ์ฆ๊ฐ€ ๋ฝ)

MySQL์—์„œ๋Š” auto_increment๋ผ๋Š” ์ปฌ๋Ÿผ์„ ํ†ตํ•ด์„œ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ’์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
auto_increment๊ฐ€ ์‚ฌ์šฉ๋œ ํ…Œ์ด๋ธ”์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ, auto_increment ์—ญ์‹œ ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ์ฆ๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ innoDB์—์„œ๋Š” ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์„ ํ†ตํ•ด (ํ…Œ์ด๋ธ” ๋ ˆ๋ฒจ ๋ฝ) ๊ด€๋ฆฌํ•œ๋‹ค.
 
์ž๋™ ์ฆ๊ฐ€ ๋ฝ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ insert, replace ๊ฐ™์ด ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์ฟผ๋ฆฌ์—์„œ๋งŒ ํ•„์š”ํ•˜๋ฉฐ, auto_increment ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์ˆœ๊ฐ„์—๋งŒ ๋ฝ์ด ๊ฑธ๋ ธ๋‹ค๊ฐ€ ์ฆ‰์‹œ ํ•ด์ œ๋œ๋‹ค. ํ…Œ์ด๋ธ”๋‹น ๋‹จ 1๊ฐœ๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, 2๊ฐœ์˜ insert๋ฌธ์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” ๋ฝ์ด ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.
 
๋ช…์‹œ์ ์œผ๋กœ ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์€ ํš๋“ํ•˜๊ณ  ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์ง€๋งŒ, ์–ด์ฐจํ”ผ ์—„์ฒญ ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ๊ฑธ๋ ธ๋‹ค๊ฐ€ ํ•ด์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ฒŒ ์˜ํ–ฅ์€ ์—†๋‹ค. MySQL 5.1๋ถ€ํ„ฐ๋Š” ์–ด๋–ค ์‹์œผ๋กœ ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์„ ์„ค์ •ํ• ์ง€ ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

- innodb_autoinc_lock_mode = 0 
๋ชจ๋“  INSERT ๋ฌธ์žฅ์€ ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋•Œ, ํ…Œ์ด๋ธ” ์ˆ˜์ค€์˜ ๋ฝ์„ ์ ์šฉํ•œ๋‹ค.

- innodb_autoinc_lock_mode = 1 (MySQL 5.x ๊ธฐ๋ณธ ๊ฐ’)
Bulk Inert ์‚ฌ์šฉ ์‹œ ํ…Œ์ด๋ธ” ๋ ˆ๋ฒจ์˜ ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์„ ์‚ฌ์šฉํ•˜๊ณ , ๋ช…๋ น๋ฌธ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ด๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.
INSERT ... SELECT, REPLACE ... SELECT, LOAD DATA ๊ฐ™์€ ๊ตฌ๋ฌธ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.
ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ์‚ฝ์ž…๋  ๋ ˆ์ฝ”๋“œ์˜ ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ๋ž˜์น˜ (๋ฎคํ…์Šค) ์ œ์–ด ํ•˜์— ํ•„์š”ํ•œ ์ˆ˜๋งŒํผ์˜ ์ž๋™ ์ฆ๊ฐ€ ๊ฐ’์„ ์–ป์–ด์„œ ์ˆ˜ํ–‰๋˜๋ฉฐ, ํ…Œ์ด๋ธ” ๋ ˆ๋ฒจ์˜ ์ž ๊ธˆ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. 

๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋“  ์ž๋™ ์ฆ๊ฐ€ ๊ฐ’์ด ์—ฐ์†์ ์ธ ๊ฐ’์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ทธ๋Ÿฌ๋‚˜, Mixed-mode insert์˜ ๊ฒฝ์šฐ ์‚ฝ์ž…ํ•  ํ–‰์˜ ์ˆ˜๋ณด๋‹ค ๋” ํฐ ์ž๋™ ์ฆ๊ฐ€ ๊ฐ’์„ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Œ์„ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.
ex) insert into tb_1 values (1, 'A'), (NULL, 'B') 
- ์ด๋Ÿฐ ์‹์œผ๋กœ null ๊ฐ’์ด ํ˜ผํ•ฉํ•˜์—ฌ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ.

- innodb_autoinc_lock_mode = 2 (MySQL 8.0 ๊ธฐ๋ณธ๊ฐ’)
์ž๋™ ์ฆ๊ฐ€ ๋ฝ์„ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฌด์กฐ๊ฑด ๋ž˜์น˜(๋ฎคํ…์Šค)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. auto_increment ๊ฐ’์˜ ์œ ๋‹ˆํฌ์„ฑ / ๋‹จ์กฐ ์ฆ๊ฐ€์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
๋Œ€๋Ÿ‰์˜ ์‚ฝ์ž… ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋„ INSERT๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์€ ๋†’์•„์ง„๋‹ค. (์—ฌ๋Ÿฌ ๋ช…๋ น๋ฌธ์ด ๋™์‹œ์— ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ) ํ•˜์ง€๋งŒ, ๋‹จ๊ฑด ์‚ฝ์ž…์˜ ๊ฒฝ์šฐ auto_increment ๊ฐ’ ์‚ฌ์ด์˜ ๊ฐญ์ด ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์‚ฝ์ž…๋  ๊ฒฝ์šฐ ๊ฐญ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ด๋Ÿฌํ•œ ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์œผ๋กœ ์ธํ•ด auto_increment์˜ ๊ฐ’์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•œ ๋ฒˆ ์ฆ๊ฐ€ํ•˜๋ฉด ์ ˆ๋Œ€ ์ค„์–ด๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ๋‹ค.
 


 
Predicate Locks for Spatial Indexes์˜ ๊ฒฝ์šฐ ๊ณต๊ฐ„ ์ธ๋ฑ์‹ฑ์„ ์ง€์›ํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์„œ ์šฐ์„  ํŒจ์Šค...!
๋‚ด์šฉ์ด ์–ด๋ ค์›Œ์„œ ์•Œ๋“ฏ๋ง๋“ฏํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
 
๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ธ๋ฑ์Šค์™€ ๋ฝ์˜ ๊ด€๊ณ„ + ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž! 

Comments