๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

MySQL

[๋™์‹œ์„ฑ ์ œ์–ด] ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€๊ณผ ๋‚™๊ด€์ /๋น„๊ด€์  ๋ฝ์˜ ํ•„์š”์„ฑ

๋น„๊ด€์  ๋ฝ๊ณผ ๋‚™๊ด€์  ๋ฝ์— ๋Œ€ํ•œ ๊ณต๋ถ€ ์ž๋ฃŒ๋Š” ์ € ์ด์™ธ์—๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ, ํ•ด๋‹น ๊ธ€์—์„œ๋Š” ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ฝ์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๊ณ  ์žˆ๋Š” ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌํ•˜์‹ ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜๊ณผ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์ดํ•ดํ•ด์„œ ๋‚™๊ด€์ , ๋น„๊ด€์  ๋ฝ์„ ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

1. ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level) ์ดํ•ดํ•˜๊ธฐ

ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(isolation)์ด๋ž€?

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

์˜ˆ๋ฅผ ๋“ค๋ฉด, AํŠธ๋žœ์žญ์…˜์—์„œ id=1 ์— ๋Œ€ํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒ ํ•  ๋•Œ, BํŠธ๋žœ์žญ์…˜์—์„œ id=1 ์— ๋Œ€ํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋•Œ, AํŠธ๋žœ์žญ์…˜์˜ ๊ฒฐ๊ณผ๊ฐ€ BํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด "๋‘ ํŠธ๋žœ์žญ์…˜์€ ๊ฒฉ๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค"๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์ด ์ง€์ผœ์งˆ ์ˆ˜๋„, ๊นจ์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ์–ด๋–จ ๋•Œ, ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์ด ์ง€์ผœ์ง€์ง€ ์•Š์„๊นŒ์š”?

2๋ฒˆ์—์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


2. ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ 4๋‹จ๊ณ„์™€ ์ด์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ 3๊ฐ€์ง€

SQL ํ‘œ์ค€์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ง„ํ–‰ ๋  ๋•Œ,

๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์•„๋ž˜์˜ ํ‘œ์ฒ˜๋Ÿผ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค.

  •  Isolation level ์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” "O" ์ด๊ณ , ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด "X" ์ž…๋‹ˆ๋‹ค.
Isolation Level Dirty Read Problem Non Repeatable Read Problem Phantom Read Problem
Read Uncommitted O O O
Read Committed X O O
Repeatable Read X X O
Serializable X X X

ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ง„ํ–‰๋  ๋•Œ, ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ 1. Dirty Read Problem

  •  ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝํ•œ ๊ฐ’์„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ํ‘œ์—์„œ T1์ด a ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋กค๋ฐฑํ•  ๊ฒฝ์šฐ, a ๊ฐ’์€ ์‹ค์ œ๋กœ DB์— ๋ฐ˜์˜๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ T2๋Š” ์ด ๋ณ€๊ฒฝ๋œ a ๊ฐ’์„ ์ฝ์–ด ๋งˆ์น˜ DB์— ๋ฐ˜์˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ Read Committed๋กœ ์˜ฌ๋ฆฌ๋ฉด, ์ปค๋ฐ‹๋˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ๋œ ํŠธ๋žœ์žญ์…˜๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์ด ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ 2. Non-repeatable Read Problem

  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ™์€ ๊ฐ’์„ ๋‘ ๋ฒˆ ์ฝ์—ˆ์„ ๋•Œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๊ฐ’์ด ์ฝํžˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, T1์ด ์ฒ˜์Œ์— a ๊ฐ’์„ ์ฝ์—ˆ๋Š”๋ฐ, T2๊ฐ€ ๊ทธ ์‚ฌ์ด์— a ๊ฐ’์„ ์‚ญ์ œํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ DB์— ๋ฐ˜์˜ํ•œ ๊ฒฝ์šฐ, T1์ด ๋‹ค์‹œ a ๊ฐ’์„ ์ฝ์œผ๋ ค ํ•  ๋•Œ a ๊ฐ’์€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ T1์ด ์ฒ˜์Œ ์ฝ์€ a ๊ฐ’๊ณผ ๋‚˜์ค‘์— ์ฝ์€ a ๊ฐ’์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ Repeatable Read ๋กœ ์˜ฌ๋ ค์„œ ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋œ ํ›„, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฝ์ง€ ์•Š์Œ์œผ๋กœ์จ ์ด ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ 3. Phantom Read Problem

  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ํ•œ ๊ฐ’์„ ๋‘ ๋ฒˆ ์ฝ์„ ๋•Œ, ์—†๋˜ ๊ฐ’์ด ์ƒ๊ฒจ์„œ ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ๋Š” Non-Repeatable Read Problem ๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ,
  • Non-Repeatable Read ์€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ผ๋ฉด, Phantom Read ๋Š” ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…์— ์˜ํ•ด ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์กŒ์„ ๋•Œ์˜ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • https://stackoverflow.com/questions/11043712/non-repeatable-read-vs-phantom-read
์ด๋ ‡๊ฒŒ ํŠธ๋žœ์žญ์…˜๋ผ๋ฆฌ ๊ฒฉ๋ฆฌ ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด,
๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜ ๋ผ๋ฆฌ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋„๋ก ํŠธ๋žœ์žญ์…˜๋“ค์„ ๊ฒฉ๋ฆฌ ์‹œ์ผœ์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.


๋ฌผ๋ก , ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์ด ๋ชจ๋‘ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
๊ทธ๋งŒํผ ์ œ์•ฝ์‚ฌํ•ญ์ด ๋งŽ์•„์ ธ ๋™์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ํŠธ๋žœ์žญ์…˜ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค์–ด ๊ฒฐ๊ตญ DB์˜ ์ „์ฒด ์ฒ˜๋ฆฌ๋Ÿ‰์ด ํ•˜๋ฝํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.( == ์„ฑ๋Šฅ์ด ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค)


๊ทธ๋ž˜์„œ, ์ผ๋ถ€ ์ด์ƒํ•œ ํ˜„์ƒ์€ ํ—ˆ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ level ์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉ์ž ํ•„์š”์— ๋”ฐ๋ผ ์„ ํƒํ•˜๋„๋ก ํ•œ ๊ฒƒ์ด ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ 4๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

์ด์ œ, ์ด ๋ฌธ์ œ๋“ค์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ 4๋‹จ๊ณ„๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฒฉ๋ฆฌ ์ˆ˜์ค€ 1๋‹จ๊ณ„ : Read Uncommitted

  • ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์œผ๋กœ, ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋กœ ์ธํ•ด, Dirty Read, Non-Repeatable Read, Phantom Read ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 4๋‹จ๊ณ„ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์ค‘ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ๋น ๋ฅด์ง€๋งŒ(ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๊ฐ€์žฅ ๋งŽ์ง€๋งŒ), ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒฉ๋ฆฌ ์ˆ˜์ค€ 2๋‹จ๊ณ„ : Read committed

  • ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.
  • Non-Repeatable Read ์™€ Phantom Read ๋Š” ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฒฉ๋ฆฌ ์ˆ˜์ค€ 3๋‹จ๊ณ„ : Repeatable Read

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

๊ฒฉ๋ฆฌ ์ˆ˜์ค€ 4๋‹จ๊ณ„ : Serializable

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

3. ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€๊ณผ "Lock" ์˜ ๊ด€๊ณ„ 

์ด๋ ‡๋“ฏ, DB๋Š” ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ 4๋‹จ๊ณ„๋กœ ๊ตฌ๋ถ„ํ•˜์˜€๊ณ , ์ด๋“ค์€ read Lock(S-Lock, shared Lock) ๊ณผ write Lock(X-Lock, exclusive Lock) ์œผ๋กœ ๊ตฌ๋ถ„ ๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • read Lock (S-Lock, shared Lock)
    • ํ•œ ํŠธ๋žœ์žญ์…˜์ด id=3 ์— ๋Œ€ํ•œ ๋ ˆ์ฝ”๋“œ์— read Lock ์„ ํš๋“ํ•˜๋ฉด, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ id=3 ์— ๋Œ€ํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ๋งŒ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • write Lock (X-Lock, exclusive Lock)
    • ํ•œ ํŠธ๋žœ์žญ์…˜์ด id=3 ์— ๋Œ€ํ•œ ๋ ˆ์ฝ”๋“œ์— write Lock ์„ ํš๋“ํ•˜๋ฉด, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ id=3 ์— ๋Œ€ํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์„ ์ˆ˜๋„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, read Lock ๊ณผ write Lock ์„ ์ด์šฉํ•ด์„œ ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜๊ณ , ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋„ ํ•œ๊ณ„๋Š” ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ”๋กœ A ํŠธ๋žœ์žญ์…˜์ด id=3 ์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด write Lock ์„ ํš๋“ํ•˜๋ฉด,  B ํŠธ๋žœ์žญ์…˜์ด id=3์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ ๋งŒ ์‹ถ์–ด๋„ read Lock ์„ ํš๋“ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, read Lock ๊ณผ write Lock ์„ ๋™์‹œ์— ํš๋“ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ์ค‘์—๋Š” ์ฝ๊ธฐ๊ฐ€ ๋ธ”๋ก๋˜์–ด ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋–จ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  read Lock write Lock
read Lock O X
write Lock X X

4. MVCC(Mulit Version Concurrency Control) ์˜ ๋“ฑ์žฅ

  • ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด read/write Lock ์„ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹์€ ํŠธ๋žœ์žญ์…˜์˜ ์ „์ฒด ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋‚ฎ๊ฒŒ ๋งŒ๋“ค์—ˆ๊ณ , ๊ฐ DBMS ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋ ฅ์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด MVCC ๋ฐฉ์‹์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

MVCC ๋ž€?

  • MVCC์˜ ๋ชฉ์ ์€ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ผ๊ด€๋œ ์ฝ๊ธฐ๋Š” ์ œ๊ณตํ•˜๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด Lock ์ด ์•„๋‹Œ ์Šค๋ƒ…์ƒท์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

MVCC์˜ ๋“ฑ์žฅ์œผ๋กœ ์ธํ•ด, ์ž ๊ธˆ ์—†์ด ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ํŠธ๋žœ์žญ์…˜์˜ ์ „์ฒด ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋†’์•„์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


5. MySQL ์˜ MVCC์™€ ๋‚™๊ด€์ , ๋น„๊ด€์  ๋ฝ์˜ ๊ด€๊ณ„

๊ทธ๋ ‡๋‹ค๋ฉด, MySQL ์€ MVCC ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๊ณ  ์žˆ์„๊นŒ์š”? 

 

MySQL 8.0 ์˜ default ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ Repeatable Read ์ด๋ฉฐ, MVCC๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ฝ๊ธฐ ์ผ๊ด€์„ฑ์„ ์ง€์›ํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • MySQL ์˜ Repeatable Read ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” MVCC๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Dirty Read, Non-Repeatable Read, Phantom Read ์˜ ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, MVCC ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋ฅผ ๋ง‰์„ ์ˆ˜๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ Lost Update ๋ฌธ์ œ๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

 

Lost Update ๋ž€?

  • AํŠธ๋žœ์žญ์…˜๋„ id=3 ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ์“ฐ๊ธฐ์ž‘์—…์„ ํ•˜๊ณ , B ํŠธ๋žœ์žญ์…˜๋„ id=3 ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ์“ฐ๊ธฐ์ž‘์—…์„ ํ•  ๋•Œ, AํŠธ๋žœ์žญ์…˜์˜ ๊ฒฐ๊ณผ๊ฐ€ BํŠธ๋žœ์žญ์…˜ ๊ฒฐ๊ณผ์— ์˜ํ•ด ๋ฎ์–ด์”Œ์–ด์ ธ์„œ AํŠธ๋žœ์žญ์…˜์˜ ๊ฒฐ๊ณผ๊ฐ€ DB์— ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋‘ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ง„ํ–‰๋˜๋ฉด

  1. ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ ( Dirty Read, Non-Repeatable read, Phantom Read )
  2. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ์›ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์ด ์ƒ๊ธฐ๋Š” ์“ฐ๊ธฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ( Lost Update ๋“ฑ )

๊ทธ๋ ‡๊ธฐ์— ์ฝ๊ธฐ ๊ด€๋ จ ๋ฌธ์ œ๋Š” MVCC ๋กœ,  ์“ฐ๊ธฐ ๊ด€๋ จ ๋ฌธ์ œ๋Š” ์ €ํฌ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•ด๊ฒฐํ•ด์•ผํ•  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

์ด ๋•Œ, ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•๋“ค ์ค‘ ํ•œ ๋ฐฉ๋ฒ•์ด ๋‚™๊ด€์ /๋น„๊ด€์  Lock ์ด๋ฉฐ, ์ €ํฌ๋Š” ์ด Lock ๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

 

๋” ๋‚˜์•„๊ฐ€์„œ, ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ํ†ตํ•ด ์ฝ๊ธฐ ์ผ๊ด€์„ฑ์„ ์ง€์ผœ์ฃผ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ DBMS๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด๋ผ ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ 2๊ฐ€์ง€๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฐ DBMS๋งˆ๋‹ค ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด default๋กœ ์„ค์ •๋œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  DBMS ์˜ default ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ๋ฌด์—‡์ธ์ง€ ์•„๋Š” ๊ฒƒ
  2. ๊ฐ DBMS๋งˆ๋‹ค ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋“ค(Lost Update, Phantom read) ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”(๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹)์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•„๋Š” ๊ฒƒ

์ถœ์ฒ˜