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

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 ๊ฐ’์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
    • ์ฆ‰, ํŠธ๋žœ์žญ์…˜1์ด ํŠธ๋žœ์žญ์…˜2์˜ ๋ฐ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์Œ์œผ๋กœ์จ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ 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" ์˜ ๊ด€๊ณ„ 

๊ณผ๊ฑฐ์˜ DBMS๋Š” ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ 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 ๋งŒ์„ ์‚ฌ์šฉํ•ด์„œ 4๋‹จ๊ณ„์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜์ž ํŠธ๋žœ์žญ์…˜์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋„ˆ๋ฌด ๋‚ฎ์•˜๊ณ , ๋‹จ์ˆœ ์ฝ๊ธฐ ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋„ ๋А๋ ธ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด MVCC ๊ฐ€ ํ˜„๋Œ€์˜ DBMS์— ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

MVCC ๋ž€?

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

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


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

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

 

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

 

MySQL ์˜ Repeatable Read ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” MVCC๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž ๊ธˆ ์—†์ด ์ฝ๊ธฐ ์ผ๊ด€์„ฑ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ํ•ด๋‹น ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” Phantom Read ๋ฌธ์ œ๋Š” ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์„ ์‚ฌ์šฉํ•ด ๋ฐฉ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

 

Lost Update ๋ž€?

  • AํŠธ๋žœ์žญ์…˜๋„ id=3 ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ์“ฐ๊ธฐ์ž‘์—…์„ ํ•˜๊ณ , B ํŠธ๋žœ์žญ์…˜๋„ id=3 ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ์“ฐ๊ธฐ์ž‘์—…์„ ํ•  ๋•Œ, AํŠธ๋žœ์žญ์…˜์˜ ๊ฒฐ๊ณผ๊ฐ€ BํŠธ๋žœ์žญ์…˜ ๊ฒฐ๊ณผ์— ์˜ํ•ด ๋ฎ์–ด์”Œ์–ด์ ธ์„œ AํŠธ๋žœ์žญ์…˜์˜ ๊ฒฐ๊ณผ๊ฐ€ DB์— ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, ์€ํ–‰๊ฐ™์ด ๊ธˆ์•ก์ด ์ค‘์š”ํ•œ ๋ถ€๋ถ„์—์„œ id=3 ์ธ ๋ ˆ์ฝ”๋“œ์— ํ•œ ๋ฒˆ์€ 500์› ์ž…๊ธˆํ•˜๊ณ , ๋‹ค๋ฅธ ๋•Œ๋Š” 1000์› ์ž…๊ธˆํ–ˆ์„ ๋•Œ, 1500์›์ด ์•„๋‹ˆ๋ผ 1000์›์ด ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— MySQL์˜ Repeatable Read ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ "A ํŠธ๋žœ์žญ์…˜์€ B/C ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค" ๋ผ๋Š” ๋ฌธ์ œ๋Š” ์ €ํฌ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•ด๊ฒฐํ•ด์•ผํ•  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

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

 

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

 

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

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

์ถœ์ฒ˜