๐Ÿ”’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Lock

ํ…์ €๋ฆฐํ‹ฐยท2023๋…„ 8์›” 25์ผ
0

์•Œ์“ธ์‹ ์žก

๋ชฉ๋ก ๋ณด๊ธฐ
6/10

๐Ÿšฅย Concurrency Control ๋™์‹œ์„ฑ ์ œ์–ด

  • ํŠธ๋žœ์žญ์…˜๋“ค์ด ๋™์‹œ์— ์ˆ˜ํ–‰๋  ๋•Œ ์ผ๊ด€์„ฑ์„ ํ•ด์น˜์ง€ ์•Š๋„๋ก ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” DBMS ๊ธฐ๋Šฅ
  • ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ๋‹ค๋ฅธ Read / Write ๊ฐ€ ์žˆ๋‹ค๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘ ๊ฐ€๋Šฅ์„ฑ
  • DB์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ๋™์‹œ์„ฑ ์ œ์–ด ๊ธฐ์ˆ  = Lock
  • NonSerializable
    • ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์˜ ๋™์‹œ ์ ‘๊ทผ์œผ๋กœ ์›๋ž˜์˜ ๊ฒฐ๊ณผ์™€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ
    • ์šฐ๋ฆฌ๋Š” Serializableํ•œ DBํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ Lock ์„ ์‚ฌ์šฉํ•จ

๐Ÿ”’ย Lock

๐Ÿ˜šย Optimistic Lock ๋‚™๊ด€์  ์ž ๊ธˆ

์ „์ œ

  • ๋ฐ์ดํ„ฐ ๊ฐฑ์‹  ์‹œ ๊ฒฝํ•ฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ด„

Lock ๋ฐฉ์‹

  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ ์‹œ, ๋™์‹œ์— ์—…๋ฐ์ดํŠธ ํ™•์•ฝ์„ ์‹œ๋„ํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ์ถฉ๋Œ ์•Œ๋ฆผ
  • ๋ฒ„์ „ ์ฝ๊ธฐ๋กœ ์ถฉ๋Œ ๊ฐ์ง€ โ†’ ๋™์‹œ์„ฑ ์ œ์–ด
    • Read, Write ์‹œ์ ์— ๋ฒ„์ „ ์ฝ๊ธฐ
    • Read Version = Write Version โ†’ Version Update
    • Read Version โ‰  Write Version โ†’ Conflict

์ ์šฉ

  • ๋™์‹œ ์—…๋ฐ์ดํŠธ ๊ฑฐ์˜ ์—†๋Š” ๊ฒฝ์šฐ

๐Ÿงย Pessimistic Lock ๋น„๊ด€์  ์ž ๊ธˆ

์ „์ œ

  • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ˆ˜์ •ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๊ณ  ๋ด„

Lock ๋ฐฉ์‹

  • ๊ฐ ํŠธ๋žœ์žญ์…˜ ์„ ํ–‰ ํŠธ๋žœ์žญ์…˜์ด ์—…๋ฐ์ดํŠธ ํ™•์•ฝ ํ›„ ๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ์„ ํ•ด์ œํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผ ํ•จ.
  • ์ž ๊ธˆ / ํ•ด์ œ -> ๋™์‹œ์„ฑ ์ œ์–ด
    • Lock
      • ํŠธ๋žœ์žญ์…˜ ๋™์•ˆ ํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ์— ์ž ๊ธˆ ์„ค์ •
      • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ ‘๊ทผ ๊ฑฐ๋ถ€
    • Unlock
      • ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒํ•˜์—ฌ ํ•„์š”์น˜ ์•Š์œผ๋ฉด ํ•ด์ œ ์„ค์ •
      • ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋˜ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ ์ ‘๊ทผ ๋ฐ ์ž ๊ธˆ ํ—ˆ์šฉ

์ ์šฉ

  • ๋™์‹œ ์—…๋ฐ์ดํŠธ ๋นˆ๋ฒˆํ•œ ๊ฒฝ์šฐ
  • ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•œ ๊ฒฝ์šฐ

์ข…๋ฅ˜

  • ๊ณต์œ  Lock
  • ๋ฐฐํƒ€ Lock
  • ์—…๋ฐ์ดํŠธ Lock
  • ๋‚ด์žฌ Lock

์šฐํ…Œ์ฝ” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฝ ์ถœ์ฒ˜

๊ณต์šฉ(Shared) Lock : S-Lock / Read-Lock

  • Read ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฝ
  • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ read ํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ
    • ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ๊ถŒ์„ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ํ•จ๊ป˜ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ
    • ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ

๋ฐฐํƒ€(Exclusive) Lock : X-Lock / Write-Lock

  • Read, Write ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฝ
  • ๋ฐฐํƒ€ Lock์„ ๊ฑด ํŠธ๋žœ์žญ์…˜๋งŒ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋…์ ๊ถŒ์„ ๊ฐ€์ง
    • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ read/write ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ

์—…๋ฐ์ดํŠธ(Update) Lock : U-Lock / Update-Lock

  • Update ์ฟผ๋ฆฌ์˜ where ํ•„ํ„ฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฝ
  • ๋ฐฐํƒ€ ๋ฝ ์‹คํ–‰ ์ „ ๋ฐ๋“œ๋ฝ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ

๋‚ด์žฌ(Intent) Lock : I-Lock

  • ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋ฝ์„ ๊ฑธ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฝ

๐Ÿ’ฐย lock ์˜ ๋‹จ์œ„

๐Ÿ’ณย Lock Escalation

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฝ ๊ด€๋ จ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ๊ธฐ๋ฒ•
  • Lock ์ด ๊ฑธ๋ฆฌ๋ฉด, ๋ฝ์ด ๊ฑธ๋ฆฐ ๋Œ€์ƒ๊ณผ ๊ทธ ์ƒ์œ„ ๋ฝ ๋‹จ์œ„์— ๋Œ€ํ•ด์„œ ๋‚ด์žฌ ๋ฝ์ด ํ•จ๊ป˜ ์ƒ์„ฑ๋จ.
    • Lock ์ž์ฒด์— ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ์ž์› ์†Œ๋ชจ๋จ.
    • ํ…Œ์ด๋ธ” ๋‚ด ์ผ์ • ๋น„์œจ ์ด์ƒ ๋ฝ ์ƒ์„ฑ ์‹œ ๋ ˆ์ฝ”๋“œ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ, ํ…Œ์ด๋ธ”์— ๋ฝ ์„ค์ •
    • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ตœ์ ํ™”

๐Ÿชซ Lock์„ ์จ๋„ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ๋ฒ•

  • ๋ฝ ๊ฑธ๋ฆฌ๋Š” ์‹œ์ ์— ๋”ฐ๋ฅธ ์ฐจ์ด

์‰ฌ์šด์ฝ”๋“œ ์œ ํŠœ๋ธŒ ์ถœ์ฒ˜

  • ์ด๋ ‡๊ฒŒ ๋ฝ์„ ๊ฑฐ๋Š” ์‹œ์ ์„ ๋ฐ”๊พธ๊ธฐ๋งŒ ํ•ด๋„ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

2PL(2-Phase Locking) Protocol

  • ํŠธ๋žœ์žญ์…˜์—์„œ ๋ชจ๋“  Locking Operation์ด ์ตœ์ดˆ์˜ Unlocking Operation ๋ณด๋‹ค ๋จผ์ € ์ˆ˜ํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ
  • ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

Conservative 2PL

  • ๋ชจ๋“  Lock ์ทจ๋“ํ•œ ๋’ค ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘
  • ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
  • ์‹ค์šฉ์ ์ด์ง€ ์•Š์Œ
-- ๋ชจ๋“  ๋ฝ ์ทจ๋“
read_lock(x)
write_lock(y)
write_lock(z)
-- ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘
read(x)
unlock(x)
read(y)
read(z)
write(y = x+y+z)
unlock(y)
write(z = 2 * x)
unlock(z)

Strict 2PL (S2PL)

  • Strict Schedule ๋ณด์žฅํ•˜๋Š” 2PL
  • Recoverability ๋ณด์žฅ
  • ๋ฐฐํƒ€ ๋ฝ์„ commit / rollback ํ•  ๋•Œ ๋ฐ˜ํ™˜
-- ๋ชจ๋“  ๋ฝ ์ทจ๋“
read_lock(x)
write_lock(y)
write_lock(z)
-- ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘
read(x)
unlock(x)
read(y)
read(z)
write(y = x+y+z)
write(z = 2 * x)
-- ์ปค๋ฐ‹
commit
-- ์ปค๋ฐ‹ ํ›„ ๋ฐฐํƒ€ ๋ฝ์„ ๋ฐ˜ํ™˜
unlock(y)
unlock(z)

Strong Strict 2PL (SS2PL / Rigorous 2PL)

  • S2PL ํ™•์žฅํŒ
  • ๊ณต์œ  ๋ฝ (read-lock), ๋ฐฐํƒ€ ๋ฝ (write-lock) ๋ชจ๋‘ commit / rollback ์‹œ ๋ฐ˜ํ™˜
  • S2PL ๋ณด๋‹ค ์‰ฌ์šด ๊ตฌํ˜„
  • ๋ฝ ์‹œ์ ์ด ๊ธธ์–ด์ง€๋ฏ€๋กœ, ์„ฑ๋Šฅ ์•…ํ™”

๐Ÿ”ชย Lock์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

  • ๊ฒฐ๋ก 
    • ๋ฝ ์‹œ๊ฐ„ ์ œํ•œ, ๋ฝ ํฌ๊ธฐ ์ œํ•œ, ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ์ถ•์†Œ ๋“ฑ ๋ฝ์— ์˜ํ•œ ์˜๋„์น˜ ์•Š์€ ์ƒํ™ฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์„ค๊ณ„๋ฅผ ๊ณ ๋ คํ•  ๊ฒƒ

Blocking

  • Lock ๊ฐ„ ๊ฒฝํ•ฉ ๋ฐœ์ƒํ•ด ํŠน์ • ์„ธ์…˜์ด ์ž‘์—… ์ง„ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉˆ์ถ˜ ์ƒํƒœ
    • ๋ฐฐํƒ€ ๋ฝ ๊ฑธ๋ฆฌ๋ฉด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ์–ด๋– ํ•œ lock ๋„ ๋ชป ๊ฑธ๊ณ  ๋Œ€๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ํŠธ๋žœ์žญ์…˜ commit ํ˜น์€ rollback ์‹œ์ ์— ๋ธ”๋กœํ‚น ํ•ด์ œ
  • ํ•ด๊ฒฐ๋ฐฉ์•ˆ
    • ํŠธ๋žœ์žญ์…˜์„ ์งง๊ฒŒ ์ •์˜
    • ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„
    • lock timeout์„ ์ด์šฉํ•˜์—ฌ ์ž ๊ธˆํ•ด์ œ ์‹œ๊ฐ„ ์กฐ์ ˆ

Deadlock ๊ต์ฐฉ์ƒํƒœ

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

0๊ฐœ์˜ ๋Œ“๊ธ€