did_story

[Database] ๋™์‹œ์„ฑ ์ œ์–ด(Concurrency Control) - Locking ๋ณธ๋ฌธ

BackEnd๐Ÿƒ/DB & SQL

[Database] ๋™์‹œ์„ฑ ์ œ์–ด(Concurrency Control) - Locking

์–ด์ œ์‹œ์ž‘ 2025. 7. 15. 12:51
์•ž์„  ๊ธ€์„ ์ฝ๊ณ  ์˜จ ๋‹น์‹ , ๋™์‹œ์„ฑ ์ œ์–ด์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ์€ ๋ฐฐ์›Œ๋ณด์•˜์„ ๊ฒƒ์ด๋‹ค. ์ด์ œ ๋‹ค์Œ ์ œ์–ด ๋ฐฉ๋ฒ•์ธ Locking์— ๋Œ€ํ•ด์„œ ๊ฐ™์ด ์•Œ์•„๋ด…์‹œ๋‹ค~!

Locking

Locking์€ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋™์•ˆ, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ฝ์ง€ ๋ชปํ•˜๋„๋ก ์ œํ•œํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ์ œํ•œํ•˜๋Š” ๋Œ€์ƒ์€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?!

1. Locking์˜ ๋Œ€์ƒ

โ‘  Row-Level Lock (ํ–‰ ๋‹จ์œ„ ์ž ๊ธˆ)

  • ์ •๋ฐ€ํ•จ: ๋‹จ ํ•œ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ(ํ–‰)์—๋งŒ ์ž ๊ธˆ์„ ๊ฑฐ๋Š” ๋ฐฉ์‹.
  • ๋™์‹œ์„ฑ ๋งค์šฐ ๋†’์Œ: ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ๊ฐ™์€ ํ…Œ์ด๋ธ” ๋‚ด ๋‹ค๋ฅธ ํ–‰์— ๋Œ€ํ•ด์„œ๋Š” ์ž‘์—… ๊ฐ€๋Šฅ.
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: MySQL InnoDB์˜ ๊ธฐ๋ณธ ์ž ๊ธˆ ๋ฐฉ์‹.
  • ๋‹จ์ : ์ž ๊ธˆ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๊ด€๋ฆฌ ๋น„์šฉ(์˜ค๋ฒ„ํ—ค๋“œ) ์ฆ๊ฐ€, ๋ณต์žกํ•œ ๋ฐ๋“œ๋ฝ ๊ฐ€๋Šฅ์„ฑ ์ฆ๊ฐ€.
// ex
UPDATE employees SET salary = 5000 WHERE id = 101;

→ id = 101 ํ–‰๋งŒ ์ƒ๊ธด๋‹ค.

โ‘ก Table-Level Lock (ํ…Œ์ด๋ธ” ์ „์ฒด ์ž ๊ธˆ)

  • ๋‹จ์ˆœํ•จ: ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ์ž ๊ทธ๋Š” ๋ฐฉ์‹
  • ๋™์‹œ์„ฑ ๋‚ฎ์Œ: ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉ ์ค‘์ด๋ฉด, ๋‚˜๋จธ์ง€ ํŠธ๋žœ์žญ์…˜์€ ๋ชจ๋‘ ๋Œ€๊ธฐ
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: MyISAM ์—”์ง„์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ
  • ์žฅ์ : ๊ตฌํ˜„ ๋ฐ ๊ด€๋ฆฌ๊ฐ€ ๋‹จ์ˆœ, ๋ฐ๋“œ๋ฝ ๊ฐ€๋Šฅ์„ฑ ๊ฑฐ์˜ ์—†์Œ
  • ๋‹จ์ : ๋Œ€๊ทœ๋ชจ ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์—์„  ๋ณ‘๋ชฉ(Bottleneck)
// ex
LOCK TABLE employees WRITE;

→ employees ํ…Œ์ด๋ธ” ์ „์ฒด๊ฐ€ ๋ฐฐํƒ€ ์ž ๊ธˆ

โ‘ข Page-Level Lock (ํŽ˜์ด์ง€ ๋‹จ์œ„ ์ž ๊ธˆ)

  • ์ ˆ์ถฉ์•ˆ: ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€(์ผ๋ฐ˜์ ์œผ๋กœ 4KB ~ 8KB)์— ํฌํ•จ๋œ ์—ฌ๋Ÿฌ ํ–‰์„ ์ž ๊ทธ๋Š” ๋ฐฉ์‹
  • ์‚ฌ์šฉ ์˜ˆ์‹œ: ์ผ๋ถ€ DBMS์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์—์„œ ์‚ฌ์šฉ
  • ์žฅ์ : Table-level๋ณด๋‹จ ๋™์‹œ์„ฑ ๋†’๊ณ , Row-level๋ณด๋‹ค ๊ด€๋ฆฌ๋น„์šฉ ์ ์Œ
  • ๋‹จ์ : ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€ ์•ˆ์— ์ž ๊ธˆ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌ

2. Lock์˜ ์ข…๋ฅ˜ (Lock Type)

โ‘  ๊ณต์œ  ์ž ๊ธˆ (shared lock / s-lock): ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฝ.

  • ๊ณต์œ  ์ž ๊ธˆ์„ ์„ค์ •ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ฝ๊ธฐ(SELECCT) ์—ฐ์‚ฐ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    1. T1์ด id=101์„ ์ฝ๊ธฐ ์œ„ํ•ด S-lock
    2. T2๋„ ๊ฐ™์€ id=101์„ ์ฝ๋Š” ๊ฒฝ์šฐ → ๊ฐ€๋Šฅ
    3. ํ•˜์ง€๋งŒ T2๊ฐ€ UPDATE ์‹œ๋„ → ๋Œ€๊ธฐ
  • ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ณต์œ ์ž ๊ธˆ (s-lock)์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    1. T1์ด id=101์„ ์ฝ๊ธฐ ์œ„ํ•ด S-lock
    2. T2๋„ ๊ฐ™์€ id=101๋ฅผ s-lock → ๊ฐ€๋Šฅ
  • ๋‹ค๋ฅธ ํŠธ๋žœ์ ์…˜๋„ ์ฝ๊ธฐ ์—ฐ์‚ฐ๋งŒ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

⇒ ์ด๋ฅผ ์‹ค์ƒํ™œ๋กœ ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด

→ 1๊ฐœ์˜ ๋ฐœ๊ถŒ๋œ ์ฑ…์„ ์ฝ๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๋Š”, ์ถœํŒ์‚ฌ๊ฐ€ ์ˆ˜์ •ํ• ๋ ค๊ณ  ํ• ๋•Œ ์šฐ๋ฆฌ ๋ชจ๋‘ ๋ฉˆ์ถฐ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ!

โ‘ก ๋ฐฐํƒ€ ์ž ๊ธˆ (exclusive lock / x-lock): ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฝ

  • ๋ฐฐํƒ€์ž ๊ธˆ์„ ์„ค์ •ํ•œ ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ ์ฝ๊ธฐ ์—ฐ์‚ฐ(read)๊ณผ ์“ฐ๊ธฐ ์—ฐ์‚ฐ(write) ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    1. T1์ด id=101์— ๋Œ€ํ•ด UPDATE ์‹คํ–‰
    2. → id=101์— ๋Œ€ํ•ด X-lock ํš๋“
    3. T2๊ฐ€ SELECT ์‹œ๋„ํ•ด๋„ ๋Œ€๊ธฐ
  • ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‚˜์˜ ๋ฐฐํƒ€์ž ๊ธˆ(X-lock)๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐฐํƒ€์ž ๊ธˆ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ์ฝ๊ธฐ ์—ฐ์‚ฐ(read)์™€ ์“ฐ๊ธฐ ์—ฐ์‚ฐ(write) ๋ชจ๋‘ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

⇒ ์ด๋ฅผ ์‹ค์ƒํ™œ๋กœ ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด

→ ๋ฌธ์„œ ์ˆ˜์ • ์ค‘์ผ ๋•Œ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์€ ์—ด๋žŒ์กฐ์ฐจ ๋ชป ํ•˜๊ฒŒ ๋ง‰๋Š” ๊ฒƒ!


3. Locking ์„ ํ™œ์šฉํ•œ ๋™์‹œ์„ฑ ์ œ์–ด ๊ธฐ๋ฒ•.

โ‘  ๋‚™๊ด€์  ๋ฝ (optimistic lock)

์ถฉ๋Œ์€ ์ž˜ ์•ˆ ๋‚  ๊ฑฐ์•ผ”๋ผ๋Š” ๋‚™์ฒœ์ ์ธ ๊ฐ€์ •์—์„œ ์ถœ๋ฐœํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  1. ๊ฐœ๋…
    • ๋‚™๊ด€์  ๋ฝ์€ ์ถฉ๋Œ์ด ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ ๊ฐ€์ •ํ•˜๊ณ , ์ฒ˜์Œ์—๋Š” Lock์„ ๊ฑธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋Š” ์‹œ์ ์— ๋ฒ„์ „ ์ •๋ณด(์˜ˆ: version ํ•„๋“œ)๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋™์‹œ์„ฑ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž‘๋™ ๋ฐฉ์‹
    1. ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค (์˜ˆ: version = 3)
    2. ์ˆ˜์ • ์ž‘์—…์„ ์ค€๋น„ํ•œ๋‹ค
    3. ์—…๋ฐ์ดํŠธํ•  ๋•Œ version = 3์ธ์ง€ ํ™•์ธ
    4. ๋งž์œผ๋ฉด ์—…๋ฐ์ดํŠธ & version ์ฆ๊ฐ€
    5. ์•„๋‹ˆ๋ผ๋ฉด ์ถฉ๋Œ๋กœ ๊ฐ„์ฃผ, ์žฌ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ
  3. ํŠน์ง•!
    • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์žฌ์‹œ๋„ ๋˜๋Š” ๋ณ‘ํ•ฉ์„ ํ†ตํ•ด์„œ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    • Lock์„ ์ง์ ‘ ๊ฑธ์ง€ ์•Š๊ณ  ๋‚ด๊ฐ€ ์ฝ์€ version์ด ๋งž๋Š”์ง€ ํ™•์ธ ํ•จ์œผ๋กœ์จ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถ”๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    • ๊ฒฝํ•ฉ์ด ์ ์€ ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. (ex.๊ฒŒ์‹œํŒ, ์‡ผํ•‘๋ชฐ, ์กฐํšŒ ์œ„์ฃผ์˜ ์„œ๋น„์Šค ๋“ฑ ์ฝ๊ธฐ๊ฐ€ ๋งŽ์€ ์‹œ์Šคํ…œ)

โ‘ก ๋น„๊ด€์  ๋ฝ (Pessimistic Lock)

์ถฉ๋Œ์ด ๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค”๋Š” ๋น„๊ด€์ ์ธ ๊ด€์ ์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฐœ๋…
    • ๋น„๊ด€์  ๋ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ๋จผ์ € Lock์„ ํš๋“ํ•˜์—ฌ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐ์ดํ„ฐ์— S-lock ๋˜๋Š” X-lock์„ ๊ฑธ์–ด, ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜๋งŒ ์ž์›์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž‘๋™ ๋ฐฉ์‹
    1. ๋ฐ์ดํ„ฐ๋ฅผ SELECTํ•˜๋ฉด์„œ Lock์„ ํ•จ๊ป˜ ํš๋“ (SELECT ... FOR UPDATE)
    2. Lock์„ ๊ฐ€์ง„ ํŠธ๋žœ์žญ์…˜๋งŒ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    3. ์ˆ˜์ • ์™„๋ฃŒ ํ›„ COMMIT → Lock ํ•ด์ œ
  3. ํŠน์ง•!
    • ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ์— lock์„ ๊ฑธ์–ด์„œ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถ”๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์ž์› ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•˜๊ณ  lock์„ ๊ฑธ์–ด๋ฒ„๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. → ๊ทธ๋Ÿฌ๋‚˜ Lock ํš๋“์œผ๋กœ ์„ฑ๋Šฅ ์ €ํ•˜ or ๋ฐ๋“œ๋ฝ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ฐฐํƒ€์ ์ธ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ณด์žฅํ•˜์—ฌ ์ถฉ๋Œ ์ž์ฒด๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•œ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— lock์„ ํš๋“ํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์•ก์„ธ์Šค๋ฅผ ์ฐจ๋‹จํ•˜๊ณ , lock์„ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ์ œ์–ดํ•œ๋‹ค. (ex. ๊ธˆ์œต, ์˜ˆ์•ฝ, ์žฌ๊ณ  ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๊ฒฝ์Ÿ์ด ๋นˆ๋ฒˆํ•œ ํ™˜๊ฒฝ )

๋งˆ๋ฌด๋ฆฌ.

๋‚™๊ด€์  ๋ฝ๊ณผ ๋น„๊ด€์  ๋ฝ์€ ์„œ๋กœ ๋ฐ˜๋Œ€๋˜๋Š” ์„ฑ๊ฒฉ์„ ๊ฐ€์ง„ ๋™์‹œ์„ฑ ์ œ์–ด ์ „๋žต์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฐฉ์‹์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”์ง€๋Š” ์‹œ์Šคํ…œ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

  • ์ฝ๊ธฐ ์œ„์ฃผ & ์ถฉ๋Œ ์ ์Œ → ๋‚™๊ด€์  ๋ฝ
  • ๊ฒฝ์Ÿ ์‹ฌํ•˜๊ณ  ์ •ํ•ฉ์„ฑ ์ค‘์š” → ๋น„๊ด€์  ๋ฝ

์—ฌ๋Ÿฌ๋ถ„์˜ ์„œ๋น„์Šค ํ™˜๊ฒฝ์— ๋งž๋Š” ๋™์‹œ์„ฑ ์ œ์–ด ์ „๋žต์„ ์ž˜ ์„ ํƒํ•˜์…”์„œ, ์•ˆ์ •์ ์ด๊ณ  ์ผ๊ด€๋œ ์‹œ์Šคํ…œ์„ ์œ ์ง€ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค!

 

์ด์ „๊ธ€์„ ์ฝ์–ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด?

2025.07.14 - [BackEnd๐Ÿƒ/DB & SQL] - [Database] ๋™์‹œ์„ฑ ์ œ์–ด(Concurrency Control) - MVCC

 

[Database] ๋™์‹œ์„ฑ ์ œ์–ด(Concurrency Control) - MVCC

์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• (๋™์‹œ์— ์ž‘์šฉํ•˜๋Š” ๋‹ค์ค‘ ํŠธ๋žœ์žญ์…˜์˜ ์ƒํ˜ธ๊ฐ„์„ญ ์ž‘์šฉ์—์„œ Database๋ฅผ

didcheck.tistory.com

 

 

*์ธ์šฉ*

https://dev.mysql.com/doc/refman/8.4/en/innodb-locking.html?utm_source=chatgpt.com

https://velog.io/@c1madang/Concurrency-Control