RealMySQL 8.0 ์„ ์ฝ๊ณ  ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชฉ์ฐจ

  1. ํŠธ๋žœ์žญ์…˜
  2. MySQL ์—”์ง„์˜ ์ž ๊ธˆ
  3. InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ž ๊ธˆ
  4. MySQL์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

ํŠธ๋žœ์žญ์…˜(Transaction)

์ž‘์—…์˜ ์™„์ „์„ฑ์„ ๋ณด์žฅํ•ด ์ฃผ๋Š” ๊ฒƒ

  1. 100% : ๋ชจ๋‘ ์™„๋ฒฝํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜
  2. 0% : ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ์—๋Š” ์› ์ƒํƒœ๋กœ ๋ณต๊ตฌํ•ด์„œ ์ž‘์—…์˜ ์ผ๋ถ€๋งŒ ์ ์šฉ๋˜๋Š” ํ˜„์ƒ(Partial update)์„ ๋ฐฉ์ง€

์ž ๊ธˆ(Lock)

๐Ÿค” ์ž ๊ธˆ ์—†์ด ์—ฌ๋Ÿฌ ์ปค๋„ฅ์…˜์ด ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด?
๊ทธ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์—ฌ๋Ÿฌ ์ปค๋„ฅ์…˜์—์„œ ๋™์‹œ์— ๋™์ผํ•œ ์ž์›์„ ์š”์ฒญํ•œ ๊ฒฝ์šฐ
์ˆœ์„œ๋Œ€๋กœ ํ•œ ์‹œ์ ์—๋Š” ํ•˜๋‚˜์˜ ์ปค๋„ฅ์…˜๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜๋Š” ์—ญํ• 

  • ํŠธ๋žœ์žญ์…˜ : ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ
  • ์ž ๊ธˆ : ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ

๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level)

ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋˜๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜ ๊ฐ„์˜ ์ž‘์—… ๋‚ด์šฉ์„ ์–ด๋–ป๊ฒŒ ๊ณต์œ ํ•˜๊ณ  ์ฐจ๋‹จํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ ˆ๋ฒจ

1. ํŠธ๋žœ์žญ์…˜

  • ๋‹จ์ผํ•œ ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ๋‹จ์œ„
  • ๋…ผ๋ฆฌ์ ์ธ ์ด์œ ๋กœ ์—ฌ๋Ÿฌ SQL๋ฌธ๋“ค์„ ๋‹จ์ผ ์ž‘์—…์œผ๋กœ ๋ฌถ์–ด์„œ ๋‚˜๋ˆ„์–ด์ง€์ง€ ์•Š๊ฒŒ ๋งŒ๋“  ๊ฒƒ
  • ์ฟผ๋ฆฌ๊ฐ€ ์ผ๋ถ€๋งŒ ์„ฑ๊ณตํ•ด์„œ DB์— ๋ฐ˜์˜๋˜๋Š” ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“  ๊ฒƒ

๐Ÿค” ํŠธ๋žœ์žญ์…˜์ด ๋ณด์žฅํ•ด์ฃผ๋Š” ๊ฒƒ์€?

์ž‘์—… ์…‹์„ 100% (COMMIT) ๋˜๋Š” 0% (ROLLBACK)๋กœ ๋งŒ๋“ค์–ด ์ž‘์—… ์…‹์˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ํŠธ๋žœ์žญ์…˜ ๊ด€์ ์—์„œ MyISAM๊ณผ InnoDB์˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์ฐจ์ด ์‚ดํŽด๋ณด๊ธฐ

  • MyISAM, MEMORY ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ : ํŠธ๋žœ์žญ์…˜ ์ง€์› X
    → ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ
    → ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถ”๊ธฐ ์–ด๋ ค์›Œ์ง
    → ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ + ๋ฐ์ดํ„ฐ ํด๋ Œ์ง• ์ฝ”๋“œ๊นŒ์ง€ ํ•„์š”ํ•˜๊ฒŒ ๋จ
  • InnoDB : ํŠธ๋žœ์žญ์…˜ ์ง€์› O
    → ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ

  • ์ปค๋„ฅ์…˜์€ ํ•„์š”ํ•œ ์‹œ์ ์— ์ƒ์„ฑํ•˜๊ธฐ
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜๊ฐ€ ์ œํ•œ๋˜์–ด์žˆ์–ด์„œ ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋„๋ก ํ•„์š”ํ•œ ์‹œ์ ์— ์ƒ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์€ ์ ์ ˆํ•œ ๋ถ„๋ฆฌ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค
    • ์•Œ๋งž๋Š” ๋…ผ๋ฆฌ๋‹จ์œ„๋กœ ์ž‘์—… ์…‹์„ ์ •ํ•ด, ๊ทธ ๋ถ€๋ถ„๋งŒ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
    • ํŠธ๋žœ์žญ์…˜ ์ค‘์— ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ Rollback์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ํŠธ๋žœ์žญ์…˜์˜ ๋ฒ”์œ„๊ฐ€ ์ปค์ง€๋ฉด, DB์™€ ๊ด€๋ จ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ Rollback์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ , ๊ฐ™์€ ์ž‘์—… ์…‹์ด ์•„๋‹Œ๋ฐ ๊ฐ™์ด Rollback ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์™ธ๋ถ€ ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ๋ฉ”์ผ ์ „์†ก์ด ํŠธ๋žœ์žญ์…˜์— ํฌํ•จ๋  ๊ฒฝ์šฐ, ๋ฉ”์ผ ์„œ๋ฒ„๊ฐ€ ๋ถˆ์•ˆ์ •ํ•˜๋ฉด, DBMS๋„ ๊ฐ™์ด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์„ ๋ถ„๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

2. MySQL ์—”์ง„์˜ ์ž ๊ธˆ

MySQL์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ž ๊ธˆ์€ ํฌ๊ฒŒ MySQL ์—”์ง„ ๋ ˆ๋ฒจ ๊ณผ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • MySQL ์—”์ง„ ๋ ˆ๋ฒจ์˜ ์ž ๊ธˆ : ๋ชจ๋“  ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์˜ํ–ฅ์„ ๋ฏธ์นจ
    • ๊ธ€๋กœ๋ฒŒ ๋ฝ
    • ํ…Œ์ด๋ธ” ๋ฝ
    • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ
    • ๋„ค์ž„๋“œ ๋ฝ (์œ ์ € ๋ ˆ๋ฒจ ๋ฝ)
  • ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ์˜ ์ž ๊ธˆ : ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๊ฐ„ ์ƒํ˜ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ
    • ๋ ˆ์ฝ”๋“œ ๋ฝ
    • ๊ฐญ ๋ฝ
    • ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ
    • ์ž๋™ ์ฆ๊ฐ€ ๋ฝ

๊ธ€๋กœ๋ฒŒ ๋ฝ

MySQL์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž ๊ธˆ ์ค‘ ๊ฐ€์žฅ ๋„“์€ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.

  • ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฒ”์œ„ : MySQL ์„œ๋ฒ„ ์ „์ฒด
  • ์ž‘์—… ๋Œ€์ƒ ํ…Œ์ด๋ธ”, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ๊ด€ ์—†์ด ๋™์ผํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜๋Š” MyISAM์ด๋‚˜ MEMORY ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด mysqldump๋กœ ์ผ๊ด€๋œ ๋ฐฑ์—…์„ ๋ฐ›์•„์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
-- ๊ธ€๋กœ๋ฒŒ ๋ฝ ํš๋“
mysql> FLUSH TABLES WITH READ LOCK;
-- UNLOCK
mysql> UNLOCK TABLES;

๐Ÿค” ํ•œ ์„ธ์…˜์—์„œ ๊ธ€๋กœ๋ฒŒ ๋ฝ์„ ํš๋“ํ•˜๋ฉด?

  • ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ SELECT๋ฅผ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ DDL์ด๋‚˜ DML ๋ช…๋ น์ด ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ๋ฐฑ์—… ๋ฝ์˜ ๋“ฑ์žฅ

  • ๊ธ€๋กœ๋ฒŒ ๋ฝ์€ MySQL ์„œ๋ฒ„ ์ „์ฒด ํ…Œ์ด๋ธ”์— ์ฝ๊ธฐ ์ž ๊ธˆ์„ ๊ฑธ์–ด๋ฒ„๋ ค ๊ฐ€๊ธ‰์  ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค.
  • 8.0๋ถ€ํ„ฐ๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” InnoDB๊ฐ€ ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์œผ๋กœ ์ฑ„ํƒ๋˜์–ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ž‘์—…์„ ๋ฉˆ์ถœ ํ•„์š”๋Š” ์—†์–ด์กŒ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฑ์—… ํˆด๋“ค์€ ๊ธ€๋กœ๋ฒŒ ๋ฝ ์ƒํ™ฉ์—๋„ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ฐฑ์—… ๋„์ค‘์— ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฐฑ์—…์ด ์‹คํŒจ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ฐฑ์—… ๋ฝ์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
-- ๋ฐฑ์—… ์‹คํ–‰
mysql> LOCK INSTANCE FOR BACKUP;
-- UNLOCK
mysql> UNLOCK INSTANCE;

๐Ÿค” ํŠน์ • ์„ธ์…˜์—์„œ ๋ฐฑ์—… ๋ฝ์„ ํš๋“ํ•˜๋ฉด?

  • ๋ชจ๋“  ์„ธ์…˜์—์„œ ํ…Œ์ด๋ธ”์˜ ์Šคํ‚ค๋งˆ๋‚˜ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ํ…Œ์ด๋ธ” ๋“ฑ ๋ชจ๋“  ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๋ณ€๊ฒฝ, ์‚ญ์ œ
    • REPAIR TABLE๊ณผ OPTIMIZE TABLE ๋ช…๋ น
    • ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
  • ์ผ๋ฐ˜์ ์ธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ๋ฝ

๊ฐœ๋ณ„ ํ…Œ์ด๋ธ” ๋‹จ์œ„๋กœ ์„ค์ •๋˜๋Š” ์ž ๊ธˆ์œผ๋กœ ๋ช…์‹œ์  ๋ฐฉ๋ฒ•๊ณผ ๋ฌต์‹œ์  ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…์‹œ์  ๋ฐฉ๋ฒ•

-- ํ…Œ์ด๋ธ” ๋ฝ
LOCK TABLES table_name [ READ | WRITE ]
-- UNLOCK
UNLOCK TABLES;

๋ฌต์‹œ์  ๋ฐฉ๋ฒ•

  • ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์ž ๊ธˆ ๋˜๋Š” ํ•ด์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • MyISAM, MEMORY
    • ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ DML ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ
  • InnoDB
    • ์Šคํ‚ค๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” DDL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ
    • InnoDB ํ…Œ์ด๋ธ”์€ ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ž ๊ธˆ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœ DML ์ฟผ๋ฆฌ๋กœ ์ธํ•ด์„œ๋Š” ํ…Œ์ด๋ธ” ๋ฝ์ด ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„ค์ž„๋“œ ๋ฝ

์ž„์˜์˜ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์ž ๊ธˆ์„ ์„ค์ •ํ•˜๋ฉฐ ์œ ์ € ๋ ˆ๋ฒจ ๋ฝ์œผ๋กœ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿค” ๋ฌธ์ž์—ด์— ์ž ๊ธˆ์„ ๊ฑด๋‹ค๋Š” ๊ฑด ์–ด๋–ค ์˜๋ฏธ์ผ๊นŒ?

๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฌธ์ž์—ด ์ž์ฒด์— ์˜๋ฏธ๋ฅผ ๋‘์–ด ๊ฐ™์€ ์ƒํ™ฉ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š” ์šฉ๋„์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด ํŠน์ • ์œ ์ €๊ฐ€ ๋™์ผ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด
ํŠธ๋žœ์žญ์…˜ ์‹œ GET_LOCK("user_name")์œผ๋กœ ๋ฝ์„ ๊ฑธ์–ด ๋™์ผํ•œ user์˜ ํ•ด๋‹น ์ž‘์—…์„ ์ž ๊ธˆ์‹œ์ผœ ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- "mylock"์ด๋ผ๋Š” ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์ž ๊ธˆ์„ ํš๋“ํ•œ๋‹ค. ์ด๋ฏธ ์ž ๊ธˆ์„ ์‚ฌ์šฉ ์ค‘์ด๋ฉด 2์ดˆ ๋™์•ˆ๋งŒ ๋Œ€๊ธฐํ•œ๋‹ค. 
select get_lock('mylock', 2); 

-- "mylock"์ด๋ผ๋Š” ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์ž ๊ธˆ์ด ์„ค์ •๋ผ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. 
select is_free_lock('mylock'); 

-- "mylock"์ด๋ผ๋Š” ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ํš๋“ํ–ˆ๋˜ ์ž ๊ธˆ์„ ๋ฐ˜๋‚ฉ(ํ•ด์ œ)ํ•œ๋‹ค.  
select release_lock('mylock'); 

-- 3๊ฐœ ํ•จ์ˆ˜ ๋ชจ๋‘ ์ •์ƒ์ ์œผ๋กœ ๋ฝ์„ ํš๋“ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•œ ๊ฒฝ์šฐ์—๋Š” 1์„, ์•„๋‹ˆ๋ฉด NULL์ด๋‚˜ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • 8.0 ๋ถ€ํ„ฐ ๋„ค์ž„๋“œ ๋ฝ์„ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋™์‹œ์— ๋ชจ๋‘ ํ•ด์ œํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ฑ…์—๋Š” 8.0 ๋ถ€ํ„ฐ๋ผ๊ณ  ํ–ˆ์ง€๋งŒ ๊ณต์‹ ๋„ํ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ 5.7 ์ด์ƒ๋ถ€ํ„ฐ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • function_release-all-locks, MySQL 5.7 Reference
-- ๋ชจ๋“  ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์ž ๊ธˆ์„ ํ•ด์ œํ•œ๋‹ค. ํ•ด์ œ๋œ ์ž ๊ธˆ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
select release_all_locks();
  • ์œ ์šฉํ•œ ๊ฒฝ์šฐ
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ 1๋Œ€์— 5๋Œ€์˜ ์›น ์„œ๋ฒ„๊ฐ€ ์ ‘์†ํ•ด ์„œ๋น„์Šคํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋™๊ธฐํ™”๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ
    • ๋ฐฐ์น˜ ํ”„๋กœ๊ทธ๋žจ์ฒ˜๋Ÿผ ๋งŽ์€ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ๋ณต์žกํ•œ ์š”๊ฑด์œผ๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํŠธ๋žœ์žญ์…˜
    • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ๋ผ๋ฆฌ ๋ถ„๋ฅ˜ํ•ด์„œ ๋„ค์ž„๋“œ ๋ฝ์„ ๊ฑธ๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฐ๋“œ๋ฝ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด(ํ…Œ์ด๋ธ”์ด๋‚˜ ๋ทฐ ๋“ฑ)์˜ ์ด๋ฆ„์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ์— ํš๋“ํ•˜๋Š” ์ž ๊ธˆ์ž…๋‹ˆ๋‹ค.

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

๐Ÿค” ์•„๋ž˜์ฒ˜๋Ÿผ 2๊ฐœ๋กœ ๋‚˜๋ˆ ์„œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด?

mysql> RENAME TABLE rank TO rank_backup;
mysql> RENAME TABLE rank_new TO rank;

์•„์ฃผ ์งง์€ ์‹œ๊ฐ„์ด์ง€๋งŒ rank ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•˜์ง€ ์•Š์•„ Table not found 'rank' ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์•„๋ž˜ ๊ตฌ๋ฌธ ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ๋‘ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ์„ ์ž๋™์œผ๋กœ ํš๋“ํ•˜๊ณ , ์ž ๊ธˆ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

mysql> RENAME TABLE rank TO rank_backup, rank_new TO rank;

3. InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ž ๊ธˆ

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€..

  • MySQL์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž ๊ธˆ๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋‚ด๋ถ€์—์„œ ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ž ๊ธˆ ๋ฐฉ์‹์ด ํƒ‘์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ž ๊ธˆ ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋›ฐ์–ด๋‚œ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ ˆ์ฝ”๋“œ ๋ฝ

ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ ์ž์ฒด๋ฅผ ์ž ๊ทธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ฐญ ๋ฝ

๋ ˆ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ ˆ์ฝ”๋“œ์™€ ๋ฐ”๋กœ ์ธ์ ‘ํ•œ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ ๋งŒ์„ ์ž ๊ทธ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ์ƒ์šฉ DBMS์™€์˜ ์ฐจ์ด
  • ๋ ˆ์ฝ”๋“œ์™€ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์— ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๊ฐ€ INSERT ๋˜๋Š” ๊ฒƒ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐญ ๋ฝ์€ ์ด ์ž์ฒด๋ณด๋‹ค๋Š” ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์˜ ์ผ๋ถ€๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ

๋ ˆ์ฝ”๋“œ ๋ฝ๊ณผ ๊ฐญ ๋ฝ์„ ํ•ฉ์ณ ๋†“์€ ํ˜•ํƒœ์˜ ์ž ๊ธˆ์ž…๋‹ˆ๋‹ค.

  • ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ์˜ ๊ฐ€์žฅ ์ฒ˜์Œ ๋ ˆ์ฝ”๋“œ์˜ ์ด์ „, ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ ๋ ˆ์ฝ”๋“œ์˜ ์ดํ›„์˜ ๊ฐญ์—๋„ ์ž ๊ธˆ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • STATEMENT ํฌ๋งท์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” MySQL ์„œ๋ฒ„
    • REAPETABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์‚ฌ์šฉ
  • ๐Ÿค” innodb_locks_unsafe_for_binlog ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๊ฐ€ ๋น„ํ™œ์„ฑํ™”(0)๋˜๋ฉด?
    • ๋ณ€๊ฒฝ์„ ์œ„ํ•ด ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์—๋Š” ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ ๋ฐฉ์‹์œผ๋กœ ์ž ๊ธˆ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
  • REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ ํŒฌํ…€ ๋ฆฌ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž ๊ธˆ
  • SELECT * WHERE pk > 99 FOR UPDATE ์‹คํ–‰ ์‹œ ์ผ์–ด๋‚˜๋Š” ์ผ๋“ค

https://velog.io/@juijeong8324/MySQL-transactionandlock

 

  • pk > 99 ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ฒซ๋ฒˆ์งธ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ pk=101 ๋ฐœ๊ฒฌ
  • ์ฒซ๋ฒˆ์งธ ์ธ๋ฑ์Šค ๋ฐœ๊ฒฌ ์ง์ „์˜ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ pk=97๋ถ€ํ„ฐ pk=101 ์‚ฌ์ด์— ๊ฐญ ๋ฝ ์ ์šฉ
  • pk > 99 ์ธ ๋ชจ๋“  ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ๋“ค ์‚ฌ์ด์—๋„ ๊ฐญ ๋ฝ ์ ์šฉ
  • pk > 99 ์ธ ๋ชจ๋“  ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ๋“ค ์‚ฌ์ด์—๋„ ๋ ˆ์ฝ”๋“œ ๋ฝ ์ ์šฉ
  • ์ฆ‰, ๊ฐญ ๋ฝ๊ณผ ๋ ˆ์ฝ”๋“œ ๋ฝ์ด ๋ณตํ•ฉ์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

InnoDB์˜ ๊ฐญ ๋ฝ๊ณผ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์˜ ๋ชฉ์ 

  • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ๊ธฐ๋ก๋˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋ ˆํ”Œ๋ฆฌ์นด ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ๋•Œ ์†Œ์Šค ์„œ๋ฒ„์—์„œ ๋งŒ๋“ค์–ด ๋‚ธ ๊ฒฐ๊ณผ์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ
  • ํ•˜์ง€๋งŒ ์˜์™ธ๋กœ ์ด๋กœ ์ธํ•ด ๋ฐ๋“œ๋ฝ์ด๋‚˜ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ์ผ์ด ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

→ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋กœ๊ทธ ํฌ๋งท์„ ROW ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์„œ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์ด๋‚˜ ๊ฐญ ๋ฝ์„ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
→ 8.0์—์„œ๋Š” ROW ํ˜•ํƒœ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๊ฐ€ ๋””ํดํŠธ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ํฌ๋งท

STATEMENT

๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํฌ๋งท์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฅผ ์ฟผ๋ฆฌ๋Œ€๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹ (5.7 ๊ธฐ๋ณธ)

ํ•œ๋ฒˆ์— ๋งŽ์€ ๋ณ€๊ฒฝ์˜ ๊ฒฝ์šฐ ํšจ๊ณผ์  (WHERE์ ˆ๋กœ ์ˆ˜๋ฐฑ๊ฐœ ๋ฐ์ดํ„ฐ UPDATE)

ROW

๋ณ€๊ฒฝ ์ž‘์—…์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ROW์˜ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹ (8.0 ๊ธฐ๋ณธ)

์ž‘์€ ๋ณ€๊ฒฝ์ด ์—ฌ๋Ÿฌ๋ฒˆ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ํšจ๊ณผ์ 

MIXED

๋‘ ๋ฐฉ์‹์„ ํ˜ผํ•ฉ

์ž๋™ ์ฆ๊ฐ€ ๋ฝ

๐Ÿค” AUTO_INCREMENT ๊ฐ€ ์‚ฌ์šฉ๋œ ํ…Œ์ด๋ธ”์— ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ ˆ์ฝ”๋“œ๊ฐ€ INSERT ๋œ๋‹ค๋ฉด?

์ค‘๋ณต๋˜์ง€ ์•Š๊ณ  ์ €์žฅ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ผ๋ จ๋ฒˆํ˜ธ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์ด๋ผ๋Š” ํ…Œ์ด๋ธ” ์ˆ˜์ค€์˜ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํŠธ๋žœ์žญ์…˜๊ณผ ๊ด€๊ณ„์—†์ด INSERT, REPLACE ๋ฌธ์—์„œ AUTO_INCREMENT ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์ˆœ๊ฐ„๋งŒ ๋ฝ์ด ๊ฑธ๋ ธ๋‹ค๊ฐ€ ์ฆ‰์‹œ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.
    • UPDATE, DELETE ๋ฌธ์—์„œ๋Š” ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ช…์‹œ์ ์œผ๋กœ ํš๋“ํ•˜๊ณ  ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์ง€๋งŒ
    • ์•„์ฃผ ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ๊ฑธ๋ ธ๋‹ค๊ฐ€ ํ•ด์ œ๋˜๋Š” ์ž ๊ธˆ์ด๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • AUTO_INCREMENT ์ปฌ๋Ÿผ์— ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ’์„ ์„ค์ •ํ•˜๋”๋ผ๋„ ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์„ ๊ฑธ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ž ๊ธˆ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ ์ฆ๊ฐ€ํ•˜๋ฉด ์ ˆ๋Œ€ ์ž๋™์œผ๋กœ ์ค„์–ด๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿค” ๋‘ ๊ฐœ์˜ INSERT ์ฟผ๋ฆฌ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋œ๋‹ค๋ฉด?

์ž๋™ ์ฆ๊ฐ€ ๋ฝ์€ ํ…Œ์ด๋ธ”์— ๋‹จ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋ฝ์„ ๊ฑธ๋ฉด ๋‚˜๋จธ์ง€ ์ฟผ๋ฆฌ๋Š” ๋ฝ์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

innodb_autoinc_lock_mode ๋ณ€์ˆ˜๋กœ ์ž‘๋™ ๋ฐฉ์‹์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (5.1 ์ด์ƒ)

  • 0 ๊ฐ’ : ๋ชจ๋“  INSERT๋ฌธ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 1 ๊ฐ’ : ์„œ๋ฒ„๊ฐ€ ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ ์‹œ ์ž๋™ ์ฆ๊ฐ€ ๋ฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํ›จ์”ฌ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅธ ๋ž˜์น˜(๋ฎคํ…์Šค)๋ฅผ ์ด์šฉํ•ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • 2 ๊ฐ’ : ๋ฌด์กฐ๊ฑด ๋ž˜์น˜๋ฅผ ์ด์šฉํ•ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค์™€ ์ž ๊ธˆ

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

  • ์ธ๋ฑ์Šค๋ฅผ ์ž ๊ทธ๋Š” ๋ฐฉ์‹์ด๋ž€?
    • ๋ณ€๊ฒฝํ•  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ๋•Œ ๊ฒ€์ƒ‰ํ•œ ์ธ๋ฑ์Šค์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๋ฝ์„ ๊ฑธ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ
  • ์ธ๋ฑ์Šค ์„ค๊ณ„๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ?
    • ์ธ๋ฑ์Šค๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค๋ฉด ํ…Œ์ด๋ธ”์„ ํ’€ ์Šค์บ”ํ•˜๋ฉด์„œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ถˆ์•ผ ํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ) ๐Ÿค” ์•„๋ž˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด 1๊ฐœ์˜ UPDATE๋ฅผ ์œ„ํ•ด ๋ช‡ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ์— ๋ฝ์„ ๊ฑธ์–ด์•ผ ํ• ๊นŒ์š”?

-- ๋ฉค๋ฒ„๋กœ ๋‹ด๊ธด ix_firstname์ด๋ผ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์ค€๋น„๋ผ ์žˆ๋‹ค๋Š” ๊ฐ€์ •์œผ๋กœ ์ง„ํ–‰

mysql> SELECT COUNT(*) FROM employees WHERE first_name='Georgi'; 
+-----------+  
|       253 |  
+-----------+  

mysql> SELECT COUNT(*) FROM employees WHERE first_name='Georgi' AND last_name='Klassen';
+-----------+  
|         1 |  
+-----------+ 

mysql> UPDATE employees SET hire_date=NOW() WHERE first_name='Georgi' AND last_name='Klassen';

first_name์—๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ last_name์—๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ ˆ์ฝ”๋“œ 253๊ฑด์ด ๋ชจ๋‘ ์ž ๊น๋‹ˆ๋‹ค.

๐Ÿค” ๋งŒ์•ฝ ์ธ๋ฑ์Šค๊ฐ€ ์•„์˜ˆ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด?

ํ’€ ์Šค์บ”์ด ์ผ์–ด๋‚˜๋ฉด์„œ 1๊ฐœ์˜ UPDATE๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ž ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ UPDATE์™€ ๊ฐ™์ด ์ž ๊ธˆ์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—… ๊ฐ™์€ ๊ฒฝ์šฐ, ์ž ๊ธˆ์˜ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™” ํ•˜๋„๋ก ์ธ๋ฑ์Šค ์„ค๊ณ„๋ฅผ ์ž˜ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ ˆ์ฝ”๋“œ ์ˆ˜์ค€์˜ ์ž ๊ธˆ ํ™•์ธ ๋ฐ ํ•ด์ œ

๋ ˆ์ฝ”๋“œ ์ˆ˜์ค€์˜ ์ž ๊ธˆ์€ ํ…Œ์ด๋ธ” ์ˆ˜์ค€ ์ž ๊ธˆ๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ณ  ๋ฌธ์ œ์˜ ์›์ธ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๊ธฐ๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๐Ÿค” ๋ฒ„์ „๋ณ„๋กœ ๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ๊ณผ ์ž ๊ธˆ์„ ๋Œ€๊ธฐํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

  • 5.1 ~ : information_schema์˜ INNODB_TRX, INNODB_LOCKS, INNODB_LOCK_WAITS ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ํ™•์ธ
  • 8.0 ~ : information_schema ์ •๋ณด๋Š” ์กฐ๊ธˆ์”ฉ deprecated ๋จ
    performance_schema์˜ data_locks์™€ data_lock_waits ํ…Œ์ด๋ธ”๋กœ ๋Œ€์ฒด๋˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

๐Ÿค” ํŠน์ • ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋–ค ์ž ๊ธˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์ƒ์„ธํžˆ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

  • performance_schema์˜ data_locks ํ…Œ์ด๋ธ”์ด ๊ฐ€์ง„ ์ปฌ๋Ÿผ์„ ๋ชจ๋‘ ์‚ดํŽด๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.
mysql> SELECT * FROM performance_schema.data_locks\G

๐Ÿค” ๊ฐ•์ œ๋กœ ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๋ ค๋ฉด?

  • KILL ๋ช…๋ น์„ ์ด์šฉํ•ด ํŠน์ • ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
-- KILL {ํŠน์ • ์Šค๋ ˆ๋“œ๋ฒˆํ˜ธ} 
mysql> KILL 17

4. MySQL์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

๐Ÿค” ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ž€?

์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ฒ˜๋ฆฌ๋  ๋•Œ ํŠน์ • ํŠธ๋žœ์žญ์…˜์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ• ์ง€ ๋ชป ๋ณด๊ฒŒ ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ

๊ฒฉ๋ฆฌ ์ˆ˜์ค€

์•„๋ž˜๋กœ ๊ฐˆ์ˆ˜๋ก ๊ณ ๋ฆฝ์„ฑ์ด ๋†’์•„์ง€๋ฉฐ, ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

  DIRTY READ NON-REPEATABLE READ PHANTOM READ ๋น„๊ณ 
READ UNCOMMITTED ๋ฐœ์ƒ ๋ฐœ์ƒ ๋ฐœ์ƒ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
READ COMMTTIED ์—†์Œ ๋ฐœ์ƒ ๋ฐœ์ƒ ์˜ค๋ผํด, PostgreSQL (๊ธฐ๋ณธ)
REPEATABLE READ ์—†์Œ ์—†์Œ ๋ฐœ์ƒ(InnoDB๋Š” ์—†์Œ) InnoDB (๊ธฐ๋ณธ)
SERIALIZABLE ์—†์Œ ์—†์Œ ์—†์Œ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

AUTOCOMMIT

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” AUTOCOMMIT์„ OFF๋กœ ํ•ด๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • MySQL์—์„œ๋Š” default๋กœ enabled ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
-- ํ™œ์„ฑํ™” ์—ฌ๋ถ€ ์กฐํšŒ
mysql> SELECT @@AUTOCOMMIT;

-- OFF๋กœ ๋ณ€๊ฒฝ
mysql> SET autocommit=OFF;

1. READ UNCOMMITED

ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด ์•„์ง COMMIT ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ๋„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dirty Read ๋ฌธ์ œ ๋ฐœ์ƒ

์–ด๋–ค ํŠธ๋žœ์žญ์…˜์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ๋„, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ํ˜„์ƒ

Dirty Read ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์‹ค์ œ DB์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž A๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ๋๋งˆ์น˜์ง€ ๋ชปํ•ด ๋กค๋ฐฑ์„ ํ•˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž B๋Š” ๋ฌดํšจ๊ฐ€ ๋œ ๋ฐ์ดํ„ฐ ๊ฐ’(Lara)๋ฅผ ์ฝ๊ณ  ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
RDBMS ํ‘œ์ค€์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์œผ๋กœ ์ธ์ •ํ•˜์ง€ ์•Š์„ ์ •๋„๋กœ ์ •ํ•ฉ์„ฑ์— ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2. READ COMMITED

  • ์˜ค๋ผํด, PostgreSQL์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฉ๋ฆฌ์ˆ˜์ค€
  • ์˜จ๋ผ์ธ ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฉ๋ฆฌ์ˆ˜์ค€

ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด COMMIT ๋œ ์ƒํƒœ์—์„œ๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠธ๋žœ์žญ์…˜์ด ์ด๋ฃจ์–ด์ง€๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

READ COMMITED ๋™์ž‘ ๋ฐฉ์‹

์‚ฌ์šฉ์ž A๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์˜€๊ณ , ์•„์ง ์ปค๋ฐ‹์€ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ํ…Œ์ด๋ธ”์€ ๋จผ์ € ๊ฐฑ์‹ ๋˜๊ณ , ์–ธ๋‘ ๋กœ๊ทธ๋กœ ๋ณ€๊ฒฝ ์ „์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฑ์—…๋ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ์‚ฌ์šฉ์ž B๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ ค๊ณ  ํ•˜๋ฉด, READ COMMITTED์—์„œ๋Š” ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ,
์–ธ๋‘ ๋กœ๊ทธ์—์„œ ๋ณ€๊ฒฝ ์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ์‚ฌ์šฉ์ž A๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๋ฉด ๊ทธ๋•Œ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋„ ์ƒˆ๋กญ๊ฒŒ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

NON-REPLEATABLE READ ๋ฌธ์ œ ๋ฐœ์ƒ

ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋˜‘๊ฐ™์€ SELECT ์ฟผ๋ฆฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์š”์ฒญํ–ˆ์„ ๋•Œ, ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ํ˜„์ƒ

์ค‘๊ฐ„์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹ํ•œ ๋ฐ์ดํ„ฐ ๋•Œ๋ฌธ์— ํ•œ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๊ฐ™์€ SELECT๋ฌธ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธˆ์ „์ ์ธ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ค๋Š˜ ์ž…๊ธˆ๋œ ๊ธˆ์•ก์˜ ์ดํ•ฉ์„ ์กฐํšŒํ•˜๋Š” ์ƒํ™ฉ์—์„œ NON-REPEATABLE READ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ,
      ์ดํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” SELECT ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

3. REPEATABLE READ

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

REPEATABLE READ ๋™์ž‘ ๋ฐฉ์‹

  • ์‚ฌ์šฉ์ž A๊ฐ€ emp_no๊ฐ€ 500000์ธ ์‚ฌ์›์˜ ์ด๋ฆ„์„ UPDATE ํ•˜๊ณ 
    ์‚ฌ์šฉ์ž B๊ฐ€ emp_no๊ฐ€ 500000์ธ ์‚ฌ์›์„ SELECT ํ•˜๋Š” ๊ณผ์ •

ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , emp_no๊ฐ€ 500000์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๋ฉด 1๊ฑด์ด ์กฐํšŒ๋˜๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„์ง ํŠธ๋žœ์žญ์…˜์€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

์ด์ „์— ์‚ฌ์šฉ์ž B๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ–ˆ๋˜ ํŠธ๋žœ์žญ์…˜์€ ์•„์ง ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ, ์‚ฌ์šฉ์ž B๊ฐ€ ๋™์ผํ•œ SELECT๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

์‚ฌ์šฉ์ž B์˜ ํŠธ๋žœ์žญ์…˜(10)์€ ์‚ฌ์šฉ์ž A์˜ ํŠธ๋žœ์žญ์…˜(12)์ด ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด๋ฏธ ์‹œ์ž‘๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
์ด ๋•Œ REPEATABLE READ๋Š” ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ฅผ ์ฐธ๊ณ ํ•ด ์ž์‹ ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋œ ํŠธ๋žœ์žญ์…˜์˜ ๋ฐ์ดํ„ฐ๋งŒ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ํ…Œ์ด๋ธ”์— ์ž์‹ ๋ณด๋‹ค ์ดํ›„์— ์‹คํ–‰๋œ ํŠธ๋žœ์žญ์…˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด? ์–ธ๋‘ ๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž A์˜ ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋˜๊ณ  ์ปค๋ฐ‹๊นŒ์ง€ ๋˜์—ˆ์ง€๋งŒ ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜(12)๋Š” ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜(10)๋ณด๋‹ค ๋‚˜์ค‘์— ์‹คํ–‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
์กฐํšŒ ์‹œ ๊ธฐ์กด๊ณผ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, REPEATABLE READ๋Š” ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์ด ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์„ ๋ณด์žฅํ•ด์ค๋‹ˆ๋‹ค.

READ COMMITED vs. REPEATABLE READ

๐Ÿค” ๋‘ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ๋ชจ๋‘ ์–ธ๋‘ ์˜์—ญ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•ด๋‘๋Š”๋ฐ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ์š”?
READ COMMITED๋„ ์–ธ๋‘ ์˜์—ญ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค์ง€๋งŒ, REPEATABLE READ๋Š” ์ด๋ณด๋‹ค ํ›จ์”ฌ ์ „ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PHANTOM READ ๋ฌธ์ œ ๋ฐœ์ƒ

ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ์‹œ์  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ์„ ๋•Œ ์กด์žฌํ•˜์ง€ ์•Š์•˜๋˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์‹œ ๊ฐ™์€ ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ๋“ค์˜€์„ ๋•Œ ์œ ๋ น์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ

REAPETABLE READ๋Š” ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ์˜ ์ถ”๊ฐ€๊นŒ์ง€๋Š” ๋ง‰์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ SELECT๋กœ ์กฐํšŒํ•œ ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ์ถ”๊ฐ€๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ Phantom Read ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ MVCC ๋•๋ถ„์— ์ผ๋ฐ˜์ ์ธ ์กฐํšŒ์—์„œ๋Š” Phantom Read๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์™œ๋ƒํ•˜๋ฉด ์ž์‹ ๋ณด๋‹ค ๋‚˜์ค‘์— ์‹คํ–‰๋œ ํŠธ๋žœ์žญ์…˜์ด ์ถ”๊ฐ€ํ•œ ๋ ˆ์ฝ”๋“œ๋Š” ๋ฌด์‹œํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๐Ÿค” ๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์ œ Phantom Read๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?
๋ฐ”๋กœ ์ž ๊ธˆ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž A๊ฐ€ employees ํ…Œ์ด๋ธ”์— INSERT๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋„์ค‘์—
    ์‚ฌ์šฉ์ž B๊ฐ€ SELECT FOR UPDATE ์ฟผ๋ฆฌ๋กœ employees ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•˜๋Š” ์ƒํ™ฉ

MySQL์€ ๊ฐญ ๋ฝ์œผ๋กœ ์ธํ•ด ๋‹ค๋ฅธ RDBMS์™€ ๋™์ž‘์ด ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์žˆ์–ด ์ผ๋ฐ˜์ ์ธ RDBMS ๊ฒฝ์šฐ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ผ๋ฐ˜์ ์ธ RDBMS

์‚ฌ์šฉ์ž B๊ฐ€ ๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š”๋ฐ, SELECT FOR UPDATE ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์“ฐ๊ธฐ ์ž ๊ธˆ์„ ๊ฑธ์—ˆ์Šต๋‹ˆ๋‹ค.

SELECT ... FOR UPDATE : ๋ฐฐํƒ€ ๋ฝ(์“ฐ๊ธฐ ์ž ๊ธˆ)์„ ๊ฑฐ๋Š” ๊ฒƒ
LOCK IN SHARE MODE : ๊ณต์œ  ๋ฝ(์ฝ๊ธฐ ์ž ๊ธˆ)์„ ๊ฑฐ๋Š” ๊ฒƒ

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž A๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ DBMS๋Š” ๊ฐญ ๋ฝ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— emp_no=500000์ธ ๋ ˆ์ฝ”๋“œ๋งŒ ์ž ๊ธˆ์ด ๊ฑธ๋ฆฐ ์ƒํƒœ์ด๊ณ , ์‚ฌ์šฉ์ž A์˜ ์š”์ฒญ์€ ์ž ๊ธˆ ์—†์ด ์ฆ‰์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด ๋•Œ ์‚ฌ์šฉ์ž B๊ฐ€ ๋™์ผํ•œ ์“ฐ๊ธฐ ์ž ๊ธˆ ์ฟผ๋ฆฌ๋กœ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด ์ด๋ฒˆ์—๋Š” 2๊ฑด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋„ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ์— ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š”๋ฐ Phantom Read๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋„ MVCC๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ๋  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋‘ ๋ฒˆ์งธ ์‹คํ–‰๋˜๋Š” SELECT FOR UPDATE ๋•Œ๋ฌธ์— ๊ทธ๋Ÿด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
MVCC์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ํ…Œ์ด๋ธ”์— ๋ฐ˜์˜ํ•˜๊ณ , ์–ธ๋‘ ๋กœ๊ทธ์— ๋ฐฑ์—…ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, SELECT FOR UPDATE๋กœ ์ž ๊ธˆ์„ ๊ฑธ์–ด๋„ ํ…Œ์ด๋ธ”์—๋Š” ๋ฐ˜์˜์ด ๋˜๊ณ , ์–ธ๋‘ ๋กœ๊ทธ์—๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์Œ“์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋งŒ์•ฝ ๋จผ์ € ์‹œ์ž‘๋œ ํŠธ๋žœ์žญ์…˜์ด ์กด์žฌํ•˜์—ฌ ์ž‘์—…์„ ํ•˜๋ฉด ํ…Œ์ด๋ธ”์—๋Š” ๋ฐ˜์˜๋˜๊ณ , ์–ธ๋‘ ๋กœ๊ทธ์—๋Š” ์ด์ „ ํŠธ๋žœ์žญ์…˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ MVCC ๋งŒ์œผ๋กœ ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ ์ œ๊ณต์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ์–ธ๋‘ ๋กœ๊ทธ์—๋„ ์ž ๊ธˆ์„ ๊ฑธ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์–ธ๋‘ ๋กœ๊ทธ๋Š” append only ํ˜•ํƒœ์ด๋ฏ€๋กœ ์ž ๊ธ€ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ SELECT FOR UPDATE๋‚˜ LOCK IN SHARE MODE๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ
์–ธ๋‘ ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํ˜„์žฌ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๊ณ , ์ด๋กœ ์ธํ•ด Phantom Read๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ MySQL์—๋Š” ๊ฐญ ๋ฝ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์ƒํ™ฉ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • MySQL

์‚ฌ์šฉ์ž B๊ฐ€ SELECT FOR UPDATE๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
MySQL์€ emp_no=500000์ธ ๋ ˆ์ฝ”๋“œ์—๋Š” ๋ ˆ์ฝ”๋“œ ๋ฝ, emp_no > 500000์ธ ๋ฒ”์œ„์—๋Š” ๊ฐญ ๋ฝ์œผ๋กœ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์„ ๊ฒ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž A๊ฐ€ emp_no=500001 ์ธ ๋ฉค๋ฒ„ ์‚ฝ์ž… ์‹œ, ์‚ฌ์šฉ์ž B์˜ ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€ ๋Œ€๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋ฉด ๋ฝ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์œผ๋กœ MySQL์˜ REAPEATABLE READ์—์„œ๋Š” Phantom Read๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

MySQL์—์„œ Phantom Read๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ์˜ ์œ ์ผํ•œ ์ผ€์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž B๋Š” ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , ์ž ๊ธˆ์ด ์—†๋Š” SELECT ๋ฌธ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž A๋Š” INSERT ๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์ž ๊ธˆ์ด ์—†์œผ๋ฏ€๋กœ ๋ฐ”๋กœ COMMIT์ด ๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž B๊ฐ€ SELECT FOR UPDATE๋กœ ์กฐํšŒ๋ฅผ ํ–ˆ๋‹ค๋ฉด, ์–ธ๋‘ ๋กœ๊ทธ๊ฐ€ ์•„๋‹Œ ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๋ฏ€๋กœ Phantom Read๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ผ€์ด์Šค๋Š” ๊ฑฐ์˜ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ,
MySQL์˜ REPEATABLE READ์—์„œ๋Š” PHANTOM READ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ด๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” MySQL ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

  • SELECT FOR UPDATE ์ดํ›„ SELECT: ๊ฐญ ๋ฝ ๋•Œ๋ฌธ์— ํŒฌํ…€ ๋ฆฌ๋“œ X
  • SELECT FOR UPDATE ์ดํ›„ SELECT FOR UPDATE: ๊ฐญ ๋ฝ ๋•Œ๋ฌธ์— ํŒฌํ…€ ๋ฆฌ๋“œ X
  • SELECT ์ดํ›„ SELECT: MVCC ๋•Œ๋ฌธ์— ํŒฌํ…€ ๋ฆฌ๋“œ X
    • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋ฐ˜๋ณต ์ฝ๊ธฐ(๊ธฐ๋ณธ ์ˆ˜์ค€)์ธ ๊ฒฝ์šฐ, ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์˜ ๋ชจ๋“  ์ผ๊ด€๋œ ์ฝ๊ธฐ๋Š” ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ ์ฒซ ๋ฒˆ์งธ ์ฝ๊ธฐ์— ์˜ํ•ด ์„ค์ •๋œ ์Šค๋ƒ…์ƒท์„ ์ฝ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๊ณ  ๊ทธ ํ›„์— ์ƒˆ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ตœ์‹  ์Šค๋ƒ…์ƒท์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html
  • SELECT ์ดํ›„ SELECT FOR UPDATE: ํŒฌํ…€ ๋ฆฌ๋“œ O

๐Ÿค” INSERT ์‹œ ์™œ PHANTOM READ๊ฐ€ ์ƒ๊ธธ๊นŒ?

์–ธ๋‘ ๋กœ๊ทธ๋Š” ์ž ๊ธˆ์„ ๊ฑธ์ˆ˜๊ฐ€ ์—†์–ด์„œ ํ˜„์žฌ ์ƒํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฒŒ ๋œ๋‹ค.
SELECT FOR UPDATE ๋ฌธ์œผ๋กœ ์ด๋ฏธ ์“ฐ์—ฌ์ง„ ๋ ˆ์ฝ”๋“œ๋“ค์— ์“ฐ๊ธฐ ์ž ๊ธˆ์„ ๊ฑธ๋ฉด์„œ ์ฝ๊ธฐ ๋•Œ๋ฌธ์—
์–ธ๋‘ ๋กœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜๋ ค ํ–ˆ์ง€๋งŒ INSERT ๋œ ์–ธ๋‘ ๋กœ๊ทธ๋Š” ์ž ๊ธˆ์„ ๊ฑธ ์ˆ˜๊ฐ€ ์—†์–ด์„œ ํ˜„์žฌ ์ƒํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

NON-REPEATABLE READ vs. PHANTOM READ

  • NON-REPEATABLE READ : ์›๋ž˜ ์žˆ๋˜ ํ–‰์˜ ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ
  • PHANTOM READ : ์ƒˆ๋กœ์šด ํ–‰์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ

๐Ÿค” InnoDB์˜ REPEATABLE READ์—์„œ๋Š” ์™œ PHANTOM READ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š์„๊นŒ?

PHANTOM READ๋Š” ์–ธ๋‘ ์˜์—ญ์— ๋ฝ์„ ๋ชป๊ฑธ์–ด์„œ ๋ฐ”๋กœ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋‹ค๋ณด๋‹ˆ ์ƒ๊ธฐ๋Š” ํ˜„์ƒ์ธ๋ฐ
InnoDB๋Š” ๊ฐญ ๋ฝ๊ณผ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์„ ์‚ฌ์šฉํ•ด ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์™€ ์ฃผ๋ณ€์˜ ๊ฐญ์— ์ž ๊ธˆ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—
๊ฐญ์— ์ƒˆ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†์–ด์„œ PHANTOM READ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4. SERIALIZABLE

ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • PHANTOM READ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฝ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๊ณ , ๊ฐ€์žฅ ๋‚ฎ์€ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
    • InnoDB๋Š” ์ˆœ์ˆ˜ํ•œ SELECT ์ฝ๊ธฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ž ๊ธˆ์ด ํ•„์š”์—†๋Š” ์ผ๊ด€๋œ ์ฝ๊ธฐ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์•„๋ฌด๋Ÿฐ ๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ ์—†์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • ์ฝ๊ธฐ ์ž‘์—…๋„ ์ฝ๊ธฐ ์ž ๊ธˆ์ด ๋ฌด์กฐ๊ฑด ๊ฑธ๋ ค์•ผ ํ•˜๊ณ , ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์ฝ๊ธฐ ์ž‘์—…์ด ์•„๋‹ˆ๋ผ๋ฉด ํŠธ๋žœ์žญ์…˜์„ ๋ชจ๋‘ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค.
  • InnoDB์—์„œ๋Š” PHANTOM READ ํ˜„์ƒ์ด REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

+ Recent posts