DB Transaction & Lock

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

์ •์˜

  • ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๋‹จ์œ„๋ฅผ ๋œปํ•˜๊ณ , ์ด ์ž‘์—…์˜ ์™„์ „์„ฑ์„ ๋ณด์žฅํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์€ CRUD๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์ž‘์—…์˜ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ , ์‹œ์Šคํ…œ์˜ ์ž…์žฅ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์ ‘๊ทผ ๋˜๋Š” ๋ณ€๊ฒฝํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค.

ํŠน์ง•

  • ์›์ž์„ฑ(Atomicity)

    • ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ชจ๋‘ ๋ฐ˜์˜๋˜๊ฑฐ๋‚˜, ์ „ํ˜€ ๋ฐ˜์˜๋˜์ง€ ์•Š์•„์•ผํ•œ๋‹ค๋Š” ๊ฒƒ

  • ์ผ๊ด€์„ฑ(Consistency)

    • ํŠธ๋žœ์žญ์…˜์˜ ์ž‘์—… ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ

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

  • ๋…๋ฆฝ์„ฑ(Isolation)

    • ๋‘˜ ์ด์ƒ์˜ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋˜๊ณ  ์žˆ์„ ๊ฒฝ์šฐ ์–ด๋–ค ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด๋ผ๋„, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์—ฐ์‚ฐ์— ๋ผ์–ด๋“ค ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๊ฐ๊ฐ์˜ ํŠธ๋žœ์žญ์…˜์€ ์„œ๋กœ ๊ฐ„์„ญ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.

  • ์ง€์†์„ฑ(Durability)

    • ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ ๋˜์—ˆ์„ ๊ฒฝ์šฐ, ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

ํŠธ๋žœ์žญ์…˜์˜ ์ƒํƒœ ๋ณ€ํ™”์™€ ํŠธ๋žœ์žญ์…˜ ์ œ์–ด์–ด

๋™์‹œ์„ฑ ์ œ์–ด ๊ธฐ๋ฒ•

  • ๋ฝํ‚น(locking): ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ์— ์ž ๊ธˆ(lock)์„ ์„ค์ •ํ•˜๋ฉด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ž ๊ธˆ์ด ํ•ด์ œ(unlock)๋  ๋•Œ๊นŒ์ง€ ์ ‘๊ทผ/์ˆ˜์ •/์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€ํ•˜๋‹ค.

  • ํƒ€์ž„์Šคํƒฌํ”„(timestamp): ์‹œ์Šคํ…œ์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ์ธ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํŠธ๋žœ์žญ์…˜์— ๋ถ€์—ฌํ•จ์œผ๋กœ์จ ํŠธ๋žœ์žญ์…˜๊ฐ„์˜ ์ ‘๊ทผ ์ˆœ์„œ๋ฅผ ๋ฏธ๋ฆฌ ์ •ํ•œ๋‹ค.

  • ๋‚™๊ด€์  ์ ํ•ฉ์„ฑ ๊ฒ€์ฆ: ๋จผ์ € ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•  ๋•Œ ์ ํ•ฉ์„ฑ์„ ๊ฒ€์ฆํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ตœ์ข… ๋ฐ˜์˜ํ•œ๋‹ค.

  • ๋‹ค์ค‘ ๋ฒ„์ „ ์ œ์–ด๊ธฐ๋ฒ•:ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ์•„์ดํ…œ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ๊ฐ’์„ ์œ ์ง€ํ•œ๋‹ค.

ํŠธ๋žœ์žญ์…˜ vs Lock

์ž ๊ธˆ(Lock)์€ ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด๊ณ , ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์˜ˆ๋น„ํ• ๋‹น(reservation)ํ•˜๋Š”๋ฐ, ์ด ์˜ˆ๋น„ํ• ๋‹น์„ ์ž ๊ธˆ์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ์ž ๊ธˆ์€ ์—ฌ๋Ÿฌ ์ปค๋„ฅ์…˜์—์„œ ๋™์‹œ์— ๋™์ผํ•œ ์ž์›(record or table)์„ ์š”์ฒญํ•  ๊ฒฝ์šฐ, ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์‹œ์ ์—๋Š” ํ•˜๋‚˜์˜ ์ปค๋„ฅ์…˜๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

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

์‹ค์ œ๋กœ ๋‚ด๊ฐ€ ์ง„ํ–‰ํ•œ Rails ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์˜ ํŠน์ง• ์ค‘ '๋…๋ฆฝ์„ฑ'์„ ์ž˜๋ชป ์ดํ•ดํ•œ ๋‚˜๋จธ์ง€ record ๋™์‹œ์ ‘๊ทผ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ActiveRecord::Base transaction ๋ฌธ์„ ์„ ์–ธํ–ˆ์—ˆ๋‹ค๊ฐ€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์—ˆ๋‹ค. Rails๋Š” ๋ณ„๋‹ค๋ฅธ ์„ค์ •์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ์—ฐ๊ฒฐ๋œ DB์— ๋”ฐ๋ผ default๋กœ ์„ค์ •๋˜๋Š” ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ๋ ˆ๋ฒจ์ด ๋‹ค๋ฅธ๋ฐ, ๋‚ด๊ฐ€ ์ผ๋˜ PostgreSQL์˜ ๊ฒฝ์šฐ read uncommited ๋ ˆ๋ฒจ๋กœ ๊ฒฉ๋ฆฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ Record ์ž์ฒด์— lock์„ ๊ฑฐ๋Š” ํ˜•์‹์œผ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.์ง€๋‚˜๊ณ ๋ณด๋‹ˆ ์ด ๋ฐฉ์‹์€ ์ž„์‹œ ๋ฐฉํŽธ์ด์—ˆ์„ ๋ฟ ๋น„์šฉ์ด ๋„ˆ๋ฌด ํฌ๋‹ค! ํ•œ ๋งˆ๋””๋กœ ์ฒ ์ด ์—†์—ˆ๋‹ค..;

ํŠธ๋žœ์žญ์…˜์˜ ์ƒํƒœ

ํŠธ๋žœ์žญ์…˜์˜ ์ƒํƒœ๋Š” ์•„๋ž˜ 5๊ฐœ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • Active: ํŠธ๋žœ์žญ์…˜์˜ ํ™œ๋™ ์ƒํƒœ. ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰ ์ค‘์ด๋ฉฐ ๋™์ž‘ ์ค‘์ธ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

  • Partially Committed: ํŠธ๋žœ์žญ์…˜์˜ Commit ๋ช…๋ น์ด ๋„์ฐฉํ•œ ์ƒํƒœ. ํŠธ๋žœ์žญ์…˜์˜ commit ์ด์ „ sql ๋ฌธ์ด ์ˆ˜ํ–‰๋˜๊ณ , commit ๋งŒ ๋‚จ์€ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

  • Failed: ํŠธ๋žœ์žญ์…˜ ์‹คํŒจ ์ƒํƒœ. ํŠธ๋žœ์žญ์…˜์ด ๋” ์ด์ƒ ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

  • Committed: ํŠธ๋žœ์žญ์…˜ ์™„๋ฃŒ ์ƒํƒœ. ํŠธ๋žœ์žญ์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋œ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

  • Aborted: ํŠธ๋žœ์žญ์…˜์ด ์ทจ์†Œ๋œ ์ƒํƒœ. ํŠธ๋žœ์žญ์…˜์ด ์ทจ์†Œ๋˜๊ณ  ํŠธ๋žœ์žญ์…˜ ์‹คํ–‰ ์ด์ „ ๋ฐ์ดํ„ฐ๋กœ ๋Œ์•„๊ฐ„ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

Commit ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ƒํƒœ๋Š” Partial Commited ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์ดํ›„ Commit์„ ๋ฌธ์ œ ์—†์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด Committed ์ƒํƒœ๋กœ ์ „์ด๋˜๊ณ , ๋งŒ์•ฝ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Failed ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์ฆ‰, Partial Commited ๋Š” Commit ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ๋ฅผ ๋งํ•˜๋ฉฐ, Commited ๋Š” Commit์„ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒํ•œ ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ฃผ์˜ํ•  ์ 

ํŠธ๋žœ์žญ์…˜์€ ์•„๋ž˜ ์ด์œ ์—์„œ ๊ผญ ํ•„์š”ํ•œ ์ตœ์†Œ์˜ ์ฝ”๋“œ์—๋งŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์€ ๊ฐœ์ˆ˜๊ฐ€ ์ œํ•œ์ ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ฐ ๋‹จ์œ„์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์ปค๋„ฅ์…˜์„ ์†Œ์œ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง„๋‹ค๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฌ์œ  ์ปค๋„ฅ์…˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๊ฒŒ ๋œ๋‹ค. ์ด๋Š” '๊ต์ฐฉ ์ƒํƒœ'๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์—์„œ ๊ต์ฐฉ์ƒํƒœ(Deadlock)?

๋ฎคํƒ์Šค๋‚˜ ์„ธ๋งˆํฌ์–ด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋งŒ๋‚ฌ๋˜ ๊ทธ ๊ต์ฐฉ ์ƒํƒœ(Deadlock)๊ฐ€ ๋งž๋‹ค. ๋‘ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์ด ํŠน์ • ์ž์›(record ๋˜๋Š” table)์˜ lock์„ ํš๋“ํ•œ ์ฑ„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ์ž ๊ธˆ์„ ์š”๊ตฌํ•˜๋ฉด ์•„๋ฌด๋ฆฌ ๊ธฐ๋‹ค๋ ค๋„ ์ƒํ™ฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” '๊ต์ฐฉ ์ƒํƒœ'์— ๋น ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ์‹œ

๊ต์ฐฉ์ƒํƒœ์˜ ๋นˆ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๋ฐฉ๋ฒ•์€?

  • ํŠธ๋žœ์žญ์…˜์ด ์ž ๊ธˆ์„ ์œ ์ง€ํ•˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ธ๋‹ค.

    • ํŠธ๋žœ์žญ์…˜์—์„œ ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ์ˆ˜๋ฅผ ์ค„์ธ๋‹ค.

    • ํŠธ๋žœ์žญ์…˜์„ ๋‘˜ ์ด์ƒ์˜ ๋” ์งง์€ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ž์ฃผ ์ปค๋ฐ‹ํ•œ๋‹ค.

  • ์ •ํ•ด์ง„ ์ˆœ์„œ๋กœ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•œ๋‹ค. ๊ฐ€๋ น ํ…Œ์ด๋ธ” B->A์˜ ์ˆœ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ํŠธ๋žœ์žญ์…˜๊ณผ ํ…Œ์ด๋ธ” A->B๋กœ ์ˆœ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ํ˜ผ์žฌํ‚ค๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํ†ต์ผํ•˜๋Š” ์‹์ด๋‹ค.

  • ์ฝ๊ธฐ ์ž ๊ธˆ ํš๋“(SELECT)์˜ ์‚ฌ์šฉ์„ ํ”ผํ•œ๋‹ค. ๊ฐ€๋ น MySQL์—์„œ SERIALIZABLE ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ๋ชจ๋“  SELECT ์ฟผ๋ฆฌ์— ์ž๋™์ ์œผ๋กœ LOCK IN SHARE MODE๊ฐ€ ๋ง๋ถ™์—ฌ์ ธ์„œ ์‹คํ–‰๋˜๋Š” ํšจ๊ณผ๊ฐ€ ๋‚˜์„œ ์ฝ๊ธฐ ์ž ๊ธˆ์„ ๊ฑธ๊ณ  ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๊ฒŒ ๋œ๋‹ค.

  • ํ•œ ํ…Œ์ด๋ธ”์˜ ๋ณต์ˆ˜ ํ–‰์„ ๋ณต์ˆ˜์˜ ์—ฐ๊ฒฐ์—์„œ ์ˆœ์„œ ์—†์ด ๊ฐฑ์‹ ํ•˜๋ฉด ๊ต์ฐฉ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ํ…Œ์ด๋ธ” ๋‹จ์œ„์˜ ์ž ๊ธˆ์„ ํš๋“ํ•ด ๊ฐฑ์‹ ์„ ์ง๋ ฌํ™”ํ•˜๋ฉด ๋™์‹œ์„ฑ์€ ๋–จ์–ด์ง€์ง€๋งŒ ๊ต์ฐฉ์ƒํƒœ๋ฅผ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜ ๊ต์ฐฉ์ƒํƒœ ๋ฐœ์ƒ์‹œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€?

๋ฐ๋“œ๋ฝ๊ณผ ๊ด€๋ จ๋˜๋Š” ํŠธ๋žœ์žญ์…˜ ๊ฐ€์šด๋ฐ ํ•˜๋‚˜๋ฅผ ํฌ์ƒ์ž(victim) ์‚ผ์•„ abort ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ 

Last updated