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

๊ฐœ๋ฐœ

MySQL์—์„œ ACID๋ฅผ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ฐœ์š”

MySQL๊ณผ ๊ฐ™์€ RDB๋Š” ์•ˆ์ „ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ๋žœ์žญ์…˜์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ACID ์„ฑ์งˆ์„ ํ•ต์‹ฌ ์›์น™์œผ๋กœ ์‚ผ๊ณ  ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค. ๋ณดํ†ต ACID ์„ฑ์งˆ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜๋œ๋‹ค.

  • Atomicity (์›์ž์„ฑ): ํŠธ๋žœ์žญ์…˜์˜ ๋ชจ๋“  ์ž‘์—…์€ ์ „๋ถ€ ์ฒ˜๋ฆฌ๋˜๊ฑฐ๋‚˜, ํ•˜๋‚˜๋„ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  • Consistency (์ผ๊ด€์„ฑ): ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋œ ํ›„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ผ๊ด€๋œ ์ƒํƒœ(๊ทœ์น™, ์ œ์•ฝ ์กฐ๊ฑด)๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
  • Isolation (๋…๋ฆฝ์„ฑ): ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์€ ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
  • Durability (์ง€์†์„ฑ): ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฐ๊ณผ๋Š” ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•œ๋‹ค.

์ •์˜์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ์•Œ๊ณ ์žˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•ด๋ณด์ง„ ์•Š์•˜๋˜ ๊ฑฐ ๊ฐ™๋‹ค. ๊ฐ‘์ž๊ธฐ ๊ถ๊ธˆํ•˜๊ธฐ๋„ ํ•ด์„œ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ด€๋ จ ๋‚ด์šฉ์„ ์ •๋ฆฌํ–ˆ๋‹ค.

 

ACID์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ Undo ๋กœ๊ทธ์™€ Redo ๋กœ๊ทธ์ด๋‹ค. ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ํŠน์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. MySQL์—์„œ๋Š” ์ด ๋‘ ๊ฐœ์˜ ๋กœ๊ทธ๋กœ ์›์ž์„ฑ๊ณผ ์ง€์†์„ฑ, ๋…๋ฆฝ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค. ์ด ๋‘ ๋กœ๊ทธ์˜ ์กด์žฌ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ์ด๋ฅผ ๋จผ์ € ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” MySQL์˜ ์•„ํ‚คํ…์ฒ˜์™€ ๋ฒ„ํผ ๊ด€๋ฆฌ ์ •์ฑ…์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

MySQL์˜ ์•„ํ‚คํ…์ฒ˜

๋จผ์ € ACID์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ•˜๊ธฐ์ „์— ๊ฐ„๋‹จํ•˜๊ฒŒ๋‚˜๋งˆ MySQL์˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์งˆ์˜ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์‹ค์ œ๋กœ SQL์„ ํ•ด์„ํ•˜๊ณ , ๊ฒ€์ฆ ๋ฐ ์ตœ์ ํ™”ํ•˜๋Š” ๊ตฌ๊ฐ„์ด๋ฉฐ, ์‹ค์ œ๋กœ SQL์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œ, ์กฐํšŒ ๋“ฑ์˜ ๋ฌผ๋ฆฌ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์งˆ์˜ ์ฒ˜๋ฆฌ๊ธฐ ์•„๋ž˜ ๊ณ„์ธต์ธ '์ €์žฅ ์‹œ์Šคํ…œ'์ด ๋‹ด๋‹นํ•œ๋‹ค.

 

์ €์žฅ ์‹œ์Šคํ…œ์—๋Š” ํ”ํžˆ ์•„๋Š” InnoDB์™€ ๊ฐ™์€ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ํ™œ์šฉ๋˜๋ฉฐ, ์ด์™ธ์—๋„ MyISAM, Memory ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ฆผ์—์„œ๋Š” ๋””์Šคํฌ๊นŒ์ง€๋ฅผ InnoDB๋ผ๊ณ  ํ‘œํ˜„ํ–ˆ์ง€๋งŒ ์ •ํ™•ํžˆ๋Š” ํŽ˜์ด์ง€ ๋ฒ„ํผ์™€ ๋กœ๊ทธ ๋ฒ„ํผ๊ฐ€ ํฌํ•จ๋œ ์˜์—ญ์ด '์ €์žฅ ์‹œ์Šคํ…œ'์ด๊ณ , ๊ทธ ์•„๋ž˜๋Š” ๋””์Šคํฌ๋กœ InnoDB๊ฐ€ ๊ด€๋ฆฌํ•  ๋ฟ InnoDB ์ž์ฒด์— ํฌํ•จ๋˜๋Š” ์˜์—ญ์€ ์•„๋‹ˆ๋‹ค.

 

์ฆ‰, ๊ทธ๋ฆผ์€ InnoDB๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋…ผ๋ฆฌ์ ์ธ ์˜์—ญ์„ ํ‘œ์‹œํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋””์Šคํฌ์— ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋“ค์„ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์ผ๋ถ€๋ถ„์€ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•œ๋‹ค. ๋˜ํ•œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋””์Šคํฌ ์ž…์ถœ๋ ฅ ํšจ์œจ์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ • ํฌ๊ธฐ์˜ ํŽ˜์ด์ง€(Page) ๋‹จ์œ„๋กœ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ๊ด€๋ฆฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ์—ญ์‹œ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ๋‚˜๋‰˜์–ด 'ํŽ˜์ด์ง€ ๋ฒ„ํผ(InnoDB ๊ณต์‹์€ ๋ฒ„ํผ ํ’€)'๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋œ๋‹ค.

 

๋ฒ„ํผ ๊ด€๋ฆฌ ์ •์ฑ…

๋ฒ„ํผ ๊ด€๋ฆฌ ์ •์ฑ…์—๋Š” Steal, No-Steal, Force, No-Force๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ๊ฐ๊ฐ์˜ ์„ค๋ช…์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • Steal: ์–ด๋– ํ•œ ์ˆ˜์ •๋œ ํŽ˜์ด์ง€๋ฅผ ์–ธ์ œ๋“ ์ง€ ๋””์Šคํฌ์— ์“ธ ์ˆ˜ ์žˆ๋Š” ์ •์ฑ…
  • No-Steal: ๋ชจ๋“  ์ˆ˜์ •๋œ ํŽ˜์ด์ง€๋Š” ์ ์–ด๋„ ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹ ํ›„ ์ข…๋ฃŒ ์‹œ์ ๊นŒ์ง€๋Š” ํŽ˜์ด์ง€ ๋ฒ„ํผ์— ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ •์ฑ…
  • Force: ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ ์ˆ˜์ •๋œ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๊ณง๋ฐ”๋กœ ๋””์Šคํฌ์— ๋ฐ˜์˜ํ•ด์•ผ ํ•˜๋Š” ์ •์ฑ…
  • No-Force: ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹์ด ์ผ์–ด๋‚˜๋„ ์ˆ˜์ •๋œ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ์— ๊ณง๋ฐ”๋กœ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๋Š” ์ •์ฑ…

ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฒ„ํผ ๊ด€๋ฆฌ ์ •์ฑ…์„ Steal, No-Force ์ •์ฑ…์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์„ฑ๋Šฅ ๋•Œ๋ฌธ์ด๋‹ค. No-Steal์˜ ๊ฒฝ์šฐ์—๋Š” ํŠธ๋žœ์žญ์…˜์ด ๊ธธ๊ฒŒ ์œ ์ง€๋˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ํŽ˜์ด์ง€ ๋ฒ„ํผ์˜ ์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , Force์˜ ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๊ณง๋ฐ”๋กœ ๋””์Šคํฌ์— ๋ฐ˜์˜ํ•˜๋‹ˆ ๊ทธ๋งŒํผ ๋‹ค๋Ÿ‰์˜ ๋””์Šคํฌ I/O๊ฐ€ ํ•œ๋ฒˆ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์„ฑ๋Šฅ์„ ์œ„ํ•ด Steal + No-Force ์ •์ฑ…์„ ์„ ํƒํ–ˆ์ง€๋งŒ, Steal ์ •์ฑ…์œผ๋กœ ์ธํ•ด ๋กค๋ฐฑ์ด ์ผ์–ด๋‚  ํŠธ๋žœ์žญ์…˜์˜ ๋ฐ์ดํ„ฐ๋„ ๋””์Šคํฌ์— ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ๊ณ , No-Force ์ •์ฑ…์œผ๋กœ ์ธํ•ด ์ปค๋ฐ‹๋˜์—ˆ์Œ์—๋„ ๋””์Šคํฌ์— ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ๋˜์–ด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ๊ฒƒ์ด ๊ฐ๊ฐ Undo ๋กœ๊ทธ์™€ Redo ๋กœ๊ทธ์ด๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ๊น… ๋ฐฉ์‹

๊ทธ๋Ÿผ ๋กœ๊ทธ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋ก๋ ๊นŒ? ๋กœ๊ทธ ๊ธฐ๋ก ๋ฐฉ์‹์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ์„ธ ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค. ๊ฐ๊ฐ '๋ฌผ๋ฆฌ์  ์ƒํƒœ ๋กœ๊น…', '๋ฌผ๋ฆฌ์  ์ „์ด ๋กœ๊น…', '๋…ผ๋ฆฌ์  ์ „์ด ๋กœ๊น…'์ด๋‹ค.

 

๋ฌผ๋ฆฌ์  ์ƒํƒœ ๋กœ๊น…

์ƒํƒœ ๋ณ€ํ™” ์ด์ „ ์ด๋ฏธ์ง€์™€ ๋ณ€ํ™” ํ›„์˜ ์ด๋ฏธ์ง€๋ฅผ ํ•จ๊ป˜ ๋กœ๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด a๋ผ๋Š” ์ปฌ๋Ÿผ์ด 1์—์„œ 2๋กœ ๋ณ€ํ™”ํ–ˆ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ๋กœ๊ทธ ๋ ˆ์ฝ”๋“œ๋Š” a์ปฌ๋Ÿผ์ด ์กด์žฌํ•˜๋Š” ๋ฌผ๋ฆฌ์ ์ธ ํŽ˜์ด์ง€์˜ n๋ฒˆ์ง€์˜ ์ด์ „ ๊ฐ’์ธ 1๊ณผ ์ดํ›„ ๊ฐ’์ธ 2๋ฅผ ํ•จ๊ป˜ ๊ธฐ๋กํ•œ๋‹ค.

 

์ด๋ฅผ ํ†ตํ•ด Undo๊ฐ€ ํ•„์š”ํ•  ๋• ์ด์ „ ์ด๋ฏธ์ง€๋ฅผ, Redo๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ดํ›„ ์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋ณต๊ตฌํ•œ๋‹ค.

 

๋ฌผ๋ฆฌ์  ์ „์ด ๋กœ๊น…

XOR ์—ฐ์‚ฐ์˜ ์ฐจ์ด๊ฐ’๋งŒ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ณต๊ตฌ ์‹œ์ ์— ๋กœ๊ทธ ๋ ˆ์ฝ”๋“œ์— ๊ธฐ๋ก๋œ ์ด๋ฏธ์ง€๋ฅผ XOR ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๋…ผ๋ฆฌ์  ์ „์ด ๋กœ๊น…

ํ•ด๋‹น ๋ฐฉ์‹์€ ๊ฐ’์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ '์–ด๋–ค ์ผ'์„ ์ˆ˜ํ–‰ํ–ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. a = a + 1๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ์„ ๋กœ๊น…ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ด์ „ ๊ฐ’ 1, ์ดํ›„ ๊ฐ’ 2์™€ ๊ฐ™์€ ๊ฐ’์„ ๋กœ๊น…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

ํ•ด๋‹น ๋กœ๊น…์€ ๋ฌผ๋ฆฌ์  ๋กœ๊น…๊ณผ ๋‹ค๋ฅด๊ฒŒ ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ’A ํ…Œ์ด๋ธ”์˜ B ์ปฌ๋Ÿผ‘๊ณผ ๊ฐ™์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋Œ€์ƒ์„ ํ‘œํ˜„ํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ B-Tree, B+Tree์˜ SMO ์—ฐ์‚ฐ์œผ๋กœ ๋ฌผ๋ฆฌ์  ์œ„์น˜๊ฐ€ ์ž์ฃผ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋กœ๊น… ์‹œ์ ๊ณผ ๋ณต๊ตฌ ์‹œ์ ์— ์œ„์น˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด ์„ธ ๊ฐ€์ง€ ๋กœ๊น… ๋ฐฉ์‹ ์ค‘ MySQL์—์„œ๋Š” Undo ๋กœ๊ทธ์—๋Š” ๋…ผ๋ฆฌ์  ์ „์ด ๋กœ๊น…์„ Redo ๋กœ๊ทธ์—๋Š” ๋ฌผ๋ฆฌ์  ์ƒํƒœ + ์ „์ด ๋กœ๊น…์„ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

 

๊ทธ ์ด์œ ๋Š” ์žฅ์• ๋กœ ์ธํ•œ ๋ณต๊ตฌ ์‹œ์—, ํ‘œ์ค€ ๋ณต๊ตฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ARIES ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Redo ๋กœ๊ทธ๋ฅผ ํ™œ์šฉํ•ด ๋ฌผ๋ฆฌ์  ์œ„์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๋•Œ๋ ค๋ฐ•์€ ํ›„์— Undo ๋กœ๊ทธ๋กœ ์•„์ง ๋๋‚˜์ง€ ์•Š์€ ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑ ์‹œํ‚ค๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

 

์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด, B-Tree์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” SMO ์—ฐ์‚ฐ ์ค‘ ์žฅ์• ๊ฐ€ ๋‚ฌ๋‹ค๋ฉด ํŠธ๋ฆฌ์˜ ๋ฌผ๋ฆฌ์  ์—ฐ๊ฒฐ์ด ์†์ƒ๋œ์ฑ„(ํฌ์ธํ„ฐ ์—ฐ๊ฒฐ์— ์‹คํŒจ ๋“ฑ)๋กœ ์„œ๋ฒ„๊ฐ€ ์žฌ๊ฐ€๋™๋œ๋‹ค. ์ด๋Ÿด๋•Œ๋Š” ๋…ผ๋ฆฌ์  ์œ„์น˜๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๊ทธ๋ž˜์„œ ๋ฌผ๋ฆฌ์  ์œ„์น˜์— ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ•์•„๋„ฃ๊ณ , B-Tree๋ฅผ ๋ณต๊ตฌํ•œ ํ›„์— ๋…ผ๋ฆฌ์  ์œ„์น˜๋ฅผ ํ†ตํ•ด ๋๋‚˜์ง€ ์•Š์€ ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด ๋กœ๊ทธ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” WAL(Write-Ahead Log) ๊ทœ์น™์„ ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋กœ๊ทธ๋ฅผ ๋จผ์ € ๋””์Šคํฌ์— ๊ธฐ๋กํ•œ๋‹ค.

 

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

MySQL์—์„œ๋Š” ์œ„์˜ ์ง€์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง€์†์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์žˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ์ ์— ๋กœ๊ทธ ๋ฒ„ํผ์— ์žˆ๋Š” ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋“ค์€ ๋ชจ๋‘ ๋””์Šคํฌ์— ์ž‘์„ฑ๋˜๋ฉฐ, fsync()์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ๋ฌผ๋ฆฌ์  ๋””์Šคํฌ์— ์™„์ „ํžˆ ๋™๊ธฐํ™” ๋˜์—ˆ์Œ์„ ํ™•์ธํ•œ ํ›„์—์•ผ ์ปค๋ฐ‹์ด ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ์ธ์ •ํ•œ๋‹ค. ์ปค๋ฐ‹ ์‹œ์  ์ด์™ธ์—๋„ WAL์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๋กœ๊ทธ ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐฌ ๊ฒฝ์šฐ, DBMS ๋‚ด๋ถ€์ ์œผ๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋กœ๊ทธ ๋ฒ„ํผ์— ์žˆ๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋“ค์ด ๋””์Šคํฌ์— ์ž‘์„ฑ๋œ๋‹ค.

 

์ด ๊ณผ์ •์—์„œ ์„œ๋ฒ„์˜ ์žฅ์• ๊ฐ€ ๋‚˜์„œ MySQL์ด ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•ด ๋กค๋ฐฑ์œผ๋กœ ๋ณต๊ตฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋™๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ ํŒŒ์ผ์—๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ปค๋ฐ‹ ์„ฑ๊ณต์œผ๋กœ ํŒ๋‹จํ•ด Redo ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•œ๋‹ค.

 

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

์›์ž์„ฑ์€ ๋Œ€ํ‘œ์ ์œผ๋กœ 3๊ฐ€์ง€ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค.

  • ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹
  • ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ
  • ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰ ์ค‘ ์žฅ์• 

์ด ์ค‘์—์„œ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์ƒํ™ฉ์˜ ๊ฒฝ์šฐ์—๋Š” ์œ„ ๋‚ด์šฉ์—์„œ ์ด๋ฏธ ์–ด๋А์ •๋„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋กค๋ฐฑ๊ณผ ์ง„ํ–‰ ์ค‘ ์žฅ์•  ์ƒํ™ฉ์— ๋Œ€ํ•ด์„œ๋งŒ ์–˜๊ธฐํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ

ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ROLLBACK์„ ํ˜ธ์ถœํ–ˆ๊ฑฐ๋‚˜, ์ˆ˜ํ–‰ ๋„์ค‘ ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์‹œ์Šคํ…œ ์ž์ฒด๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Undo ๋กœ๊ทธ๋ฅผ ์—ญ๋ฐฉํ–ฅ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋“ค์„ ๋กค๋ฐฑํ•œ๋‹ค.

 

๋ฐ์ดํ„ฐ๋“ค์„ ๋กค๋ฐฑํ•˜๋ฉด์„œ, Undo ์ž‘์—…์— ๋Œ€ํ•œ ๋ณด์ƒ ๋กœ๊ทธ ๋ ˆ์ฝ”๋“œ๋„ ํ•จ๊ป˜ Redo ๋กœ๊ทธ์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด๋Š” ๋กค๋ฐฑ ์ค‘ ์žฅ์• ๋กœ ์ธํ•ด ์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์žฌ์‹œ๋™ํ•˜๋ฉด์„œ ํ–ˆ๋˜ Undo ์ž‘์—…์„ ๋‹ค์‹œ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด 100๊ฐœ์˜ Undo ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ 50๊ฐœ ์ •๋„ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ ์„œ๋ฒ„๊ฐ€ ์žฌ์‹œ๋™๋˜๋ฉด ๋ณด์ƒ ๋กœ๊ทธ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— ๋‹ค์‹œ ์ฒซ ๋ฒˆ์งธ Undo ์ž‘์—…๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๋ณด์ƒ ๋กœ๊ทธ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ž‘์—…์˜ ์ง„ํ–‰ ์ •๋„๋ฅผ ๊ธฐ๋กํ•˜์—ฌ ์ค‘๋ณต Undo ์ž‘์—…์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰ ์ค‘ ์žฅ์• 

ํ•ด๋‹น ์ƒํ™ฉ์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋กค๋ฐฑ์˜ ๊ณผ์ •๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ง„ํ–‰๋œ๋‹ค. ๋‹ค๋งŒ, ์ง„ํ–‰ ๋„์ค‘ ๋ฐ์ดํ„ฐ์˜ ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ(B-Tree ๋“ฑ)๊ฐ€ ์†์ƒ๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋จผ์ € Redo ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ์žฅ์•  ๋ฐœ์ƒ ์ง์ „์˜ ์ƒํƒœ๋กœ ๋ฌผ๋ฆฌ์  ๋ณต๊ตฌ๋ฅผ ์ง„ํ–‰ํ•œ ํ›„์— ๋…ผ๋ฆฌ์ ์ธ ๋กค๋ฐฑ(Undo)์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๋งŒ์•ฝ ๋กœ๊ทธ ๋ฒ„ํผ์˜ ๋‚ด์šฉ์ด ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜๊ธฐ๋„ ์ „์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด ์œ ์‹ค๋œ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด๋ฅผ '์„ฑ๊ณต์ ์œผ๋กœ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฏธ์™„์„ฑ ํŠธ๋žœ์žญ์…˜'์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ ์‹ค๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตณ์ด ์‚ด๋ ค๋‚ผ ์˜๋ฌด๊ฐ€ ์—†์œผ๋ฉฐ, ์˜คํžˆ๋ ค ์›์ž์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์•„์˜ˆ ์—†๋˜ ์ผ๋กœ ๋ฌดํšจํ™” ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์ด๋‹ค.

 

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

๋…๋ฆฝ์„ฑ์€ ์œ„์˜ Undo, Redo ๋กœ๊ทธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋” ๋งŽ์€ ์ง€์‹์„ ์š”๊ตฌํ•œ๋‹ค. ์ฃผ์š” ๊ฐœ๋…์œผ๋กœ๋Š” MVCC, ๋ฝ, ๊ฒฉ๋ฆฌ ์ˆ˜์ค€, ์ฝ๊ธฐ ํ˜„์ƒ ๋“ฑ์ด ์žˆ๋‹ค. ๋จผ์ € ํ•ด๋‹น ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์•Œ๋ฉด ๋…๋ฆฝ์„ฑ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

Read Phenomena (์ฝ๊ธฐ ํ˜„์ƒ)

Dirty Read

์ด๋Š” ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๋Š” ๊ฒƒ์œผ๋กœ, ๊ฐ ํŠธ๋žœ์žญ์…˜์ด ์„œ๋กœ ๋…๋ฆฝ์ ์ด์ง€ ์•Š์•„ ๋ฐœ์ƒํ•œ๋‹ค.

 

๊ทธ๋ฆผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด Tx1์€ ์•„์ง ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ Tx2์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฝ๊ธฐ ๋•Œ๋ฌธ์— Tx2๊ฐ€ ๋กค๋ฐฑ ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์‹ค์ƒ ์กด์žฌํ•˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฝ๊ฒŒ ๋œ ๊ฒƒ์ด๋ผ ํฐ ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

Non-Repeatable Read

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

 

ํ•ด๋‹น ํ˜„์ƒ์œผ๋กœ ์ธํ•ด ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•˜๋Š” ์กฐํšŒ์˜ ๊ฒฝ์šฐ ๋‘ ๊ฐœ์˜ ํ•ฉ๊ณ„๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

Phantom Read

Phantom Read๋Š” Non-Repeatable Read์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋ ˆ์ฝ”๋“œ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฒ”์œ„ ๊ฒ€์ƒ‰์ด๋ผ๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ์กด ํ–‰์ด ๋ณ€๊ฒฝ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ํ–‰์ด ๋ฐœ๊ฒฌ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

SQL ํ‘œ์ค€์—์„œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ 4๋‹จ๊ณ„๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค.

 

Read Uncommited

๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ๋ฏธ์ปค๋ฐ‹ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค. ๊ฐ€์žฅ ๋‚ฎ์€ ๋…๋ฆฝ์„ฑ์„ ๊ฐ€์ง„ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ฉฐ ์œ„์—์„œ ์–˜๊ธฐํ•œ Dirty Read๋‚˜ Non-Repeatable Read, Phantom Read์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.  PostgreSQL์—์„œ๋Š” ๊ณต์‹์ ์œผ๋กœ ํ•ด๋‹น ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์ง€์›ํ•˜๊ธด ํ•˜๋‚˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์€ Read Commited๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋˜์–ด์žˆ๋‹ค.

 

Read Commited

์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค. Dirty Read ๋ฌธ์ œ๋Š” ๋ง‰์„ ์ˆ˜ ์žˆ์ง€๋งŒ, Non-Repeatable Read, Phantom Read ๋ฌธ์ œ๋Š” ๋ง‰์ง€ ๋ชปํ•œ๋‹ค.

 

Repeatable Read

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

 

ํŠน์ • ์ƒํ™ฉ์ด๋ผํ•จ์€ select ... for update์™€ ๊ฐ™์€ ์“ฐ๊ธฐ ์ž ๊ธˆ์„ ๊ฑธ๊ณ  ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ๋ฅผ ๋งํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์กฐํšŒํ•  ๋•Œ MVCC๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Undo ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์ด ๋ฐ”๋ผ๋ด์•ผ ํ•˜๋Š” ์‹œ์ ์˜ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ํ•˜์ง€๋งŒ for update๋ฅผ ํ†ตํ•ด ์กฐํšŒํ•˜๋ฉด ์กฐํšŒํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์— ๋ฝ์„ ๊ฑธ์–ด์•ผ ํ•˜์ง€๋งŒ ๋ฐฑ์—… ๋ฐ์ดํ„ฐ์ธ Undo ๋กœ๊ทธ ๋ ˆ์ฝ”๋“œ์—๋Š” ๋ฝ์„ ๊ฑธ ์ˆ˜๊ฐ€ ์—†๋‹ค.

 

๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋Š” ์–ด์ฉ” ์ˆ˜ ์—†์ด Undo ๋กœ๊ทธ๊ฐ€ ์•„๋‹Œ ํ˜„์žฌ ์‹œ์ ์˜ ์‹ค์ œ ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ์— ๋ฝ์„ ๊ฑธ๊ณ  ์กฐํšŒํ•˜๊ธฐ์— Phantom Read๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

Serializable

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ฉด์„œ ๋™์‹œ์— ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค. ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋™์‹œ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ ˆ๋Œ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋งŒํผ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ๋„ ๋‚ฎ์•„์ง„๋‹ค.

 

์ด๋Ÿฌํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ๋ช…์„ธ์ด๊ธฐ์— ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ 'Lock (์ž ๊ธˆ)'์ด๋ผ๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์„ ํ™œ์šฉํ•œ๋‹ค.

 

Lock (์ž ๊ธˆ) ๋งค์ปค๋‹ˆ์ฆ˜

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•ž์„œ ์„ค๋ช…ํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ Lock์ด๋‹ค. ๋™์‹œ์„ฑ ์ถฉ๋Œ์„ ๋ฐ”๋ผ๋ณด๋Š” ๊ด€์ ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋น„๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด์™€ ๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

 

๋น„๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด

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

 

๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ œ์–ด

ํŠธ๋žœ์žญ์…˜ ๊ฐ„ ์ถฉ๋Œ์ด ๋“œ๋ฌผ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ, ์ž ๊ธˆ์—†์ด ์ž์œ ๋กญ๊ฒŒ ์ฝ๊ณ  ์“ฐ๋ฉด์„œ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๋Š” ์‹œ์ ์— ์ถฉ๋Œ์ด ์žˆ์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ž ๊ธˆ ์œ ์ง€ ๋น„์šฉ์ด ์—†์œผ๋‹ˆ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์—†๊ณ  ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋†’์•„์ง„๋‹ค.

 

๋‹ค๋งŒ, ์ปค๋ฐ‹ ์‹œ์ ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜์ •ํ–ˆ๋‹ค๋Š” ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋กค๋ฐฑ๋œ๋‹ค.

 

MVCC (๋‹ค์ค‘ ๋ฒ„์ „ ๋™์‹œ์„ฑ ์ œ์–ด)

ํ˜„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ž ๊ธˆ ๋งค์ปค๋‹ˆ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋งŒ์œผ๋กœ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ , ๋‘ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ๊ฒฐํ•ฉํ•œ MVCC๋ฅผ ํ™œ์šฉํ•œ๋‹ค. ์ด๋Š” ์›๋ณธ์˜ ๋ฐ์ดํ„ฐ์™€ ๋ณ€๊ฒฝ ์ค‘์ธ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์•ž์„œ ๋‹ค๋ฃจ์—ˆ๋˜ Undo ๋กœ๊ทธ๊ฐ€ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ํŠธ๋žœ์žญ์…˜ A๊ฐ€ a = 10์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ a = 11๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์“ฐ๊ธฐ ์ž‘์—…์„ ์ง„ํ–‰ ์ค‘์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด๋•Œ ์ด ๋ ˆ์ฝ”๋“œ์—๋Š” ๋น„๊ด€์ ์ธ ์“ฐ๊ธฐ ์ž ๊ธˆ์ด ๊ฑธ๋ฆฐ๋‹ค. ํ•˜์ง€๋งŒ ์ด์™€ ๋™์‹œ์— ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•  ๋•Œ, MVCC๋Š” ํŠธ๋žœ์žญ์…˜ B๋ฅผ ๋Œ€๊ธฐ ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  Undo ๋กœ๊ทธ์— ๋ฐฑ์—…๋œ ๋ณ€๊ฒฝ ์ „ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

Undo ๋กœ๊ทธ๊ฐ€ ๋…ผ๋ฆฌ์ ์ธ ์ „์ด ๋กœ๊น… ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋กํ•˜๊ธฐ์— ์–ด๋–ป๊ฒŒ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€๊ฐ€ ๊ถ๊ธˆํ•ด์„œ ์ฐพ์•„๋ณด์•˜๋Š”๋ฐ, ์ด๋Š” ์—ญ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด์„œ ์ฐพ์•„์˜จ๋‹ค.

 

์ •๋ฆฌํ•˜๋ฉด, ์ฝ๊ธฐ ์ž‘์—…์€ ๋‚™๊ด€์  ํŠน์„ฑ์„ ํ™œ์šฉํ•ด ๊ณผ๊ฑฐ์˜ ์Šค๋ƒ…์ƒท์„ ํ†ตํ•ด ๋ฝ ์—†์ด ์ฒ˜๋ฆฌํ•˜๊ณ , ์“ฐ๊ธฐ ์ž‘์—…์€ ๋น„๊ด€์  ํŠน์„ฑ์„ ํ™œ์šฉํ•ด ๋ฝ์„ ๊ฑธ์–ด ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. MySQL์˜ Repeatable Read ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋ฐ”๋กœ ์ด MVCC๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

InnoDB์˜ ํŠน๋ณ„ํ•œ ์ž ๊ธˆ: Gap Lock๊ณผ Next-Key Lock

MVCC๋ฅผ ํ†ตํ•ด ๋ฝ ์—†๋Š” ์ฝ๊ธฐ๋ฅผ ๋ณด์žฅํ•˜๋”๋ผ๋„, ์•ž์„œ ์„ค๋ช…ํ•œ SELECT ... FOR UPDATE์™€ ๊ฐ™์ด ๋ช…์‹œ์ ์ธ ์“ฐ๊ธฐ ์ž ๊ธˆ์„ ๊ฑธ์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ์–ด์ฉ” ์ˆ˜ ์—†์ด ์‹ค์ œ ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ์— ์ž ๊ธˆ์„ ๊ฑธ๊ฒŒ ๋˜๋ฉฐ, ์ด๋กœ ์ธํ•ด Phantom Read ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ MySQL์€ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋„ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœํ•œ ํ–‰ ๋‹จ์œ„ ์ž ๊ธˆ(Record Lock)์„ ๋„˜์–ด์„  ํŠน๋ณ„ํ•œ ๋ฝ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

  1. ๋ ˆ์ฝ”๋“œ ๋ฝ (Record Lock): ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์ž์ฒด์—๋งŒ ๊ฑฐ๋Š” ๊ธฐ๋ณธ์ ์ธ ์ž ๊ธˆ์ด๋‹ค.
  2. ๊ฐญ ๋ฝ (Gap Lock): ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๋นˆ ๊ณต๊ฐ„(Gap)์„ ์ž ๊ทธ๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ด ๊ณต๊ฐ„์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ INSERTํ•˜๋Š” ๊ฒƒ์„ ์›์ฒœ ์ฐจ๋‹จํ•œ๋‹ค.
  3. ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ (Next-Key Lock): InnoDB๊ฐ€ Repeatable Read ํ™˜๊ฒฝ์—์„œ ๋ฒ”์œ„ ๊ฒ€์ƒ‰ ์‹œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ž ๊ธˆ์œผ๋กœ, ๋ ˆ์ฝ”๋“œ ๋ฝ๊ณผ ๊ฐญ ๋ฝ์„ ๊ฒฐํ•ฉํ•œ ํ˜•ํƒœ์ด๋‹ค. ํŠน์ • ๋ ˆ์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ ๋ ˆ์ฝ”๋“œ ์•ž์˜ ๊ฐ„๊ฒฉ๊นŒ์ง€ ํ•จ๊ป˜ ์ž ๊ฐ€๋ฒ„๋ฆฐ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, MySQL์€ Repeatable Read ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ MVCC๋ฅผ ํ†ตํ•ด ๋†’์€ ๋™์‹œ์„ฑ์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„, ๋ฒ”์œ„ ๊ฒ€์ƒ‰์ด๋‚˜ ๋ฐฐํƒ€์  ๋ฝ์ด ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋Š” ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์„ ๋™์›ํ•˜์—ฌ ๋นˆ ๊ณต๊ฐ„(Gap)๊นŒ์ง€ ํ‹€์–ด๋ง‰์Œ์œผ๋กœ์จ Phantom Read๋ฅผ ์ตœ๋Œ€ํ•œ ์–ต์ œํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ๋…๋ฆฝ์„ฑ(Isolation)์„ ์ฒ ์ €ํ•˜๊ฒŒ ์ง€์ผœ๋‚ธ๋‹ค.

 

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

๋งˆ์ง€๋ง‰์œผ๋กœ ACID์˜ 'C'์— ํ•ด๋‹นํ•˜๋Š” ์ผ๊ด€์„ฑ(Consistency)์ด๋‹ค. ์•ž์„œ ์‚ดํŽด๋ณธ ์›์ž์„ฑ(A), ๊ณ ๋ฆฝ์„ฑ(I), ์ง€์†์„ฑ(D)์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„(InnoDB์˜ ๋กœ๊ทธ, ๋ฒ„ํผ, ๋ฝ ๋“ฑ)์˜ ์‹œ์Šคํ…œ์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๊ฐ•์ œ์ ์œผ๋กœ ๋ณด์žฅ๋œ๋‹ค๋ฉด, ์ผ๊ด€์„ฑ์€ ์กฐ๊ธˆ ๊ฒฐ์ด ๋‹ค๋ฅด๋‹ค.

 

์ผ๊ด€์„ฑ์€ ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋œ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๊ฐ€ ์‚ฌ์ „์— ์ •์˜๋œ '๊ทœ์น™'์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ œ์•ฝ์กฐ๊ฑด(Primary Key, Foreign Key, Unique, Not Null ๋“ฑ)์„ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ ๋ฌด๊ฒฐ์„ฑ์ด ์ง€์ผœ์ง„๋‹ค.

 

ํ•˜์ง€๋งŒ ์ง„์ •ํ•œ ์˜๋ฏธ์˜ ์ผ๊ด€์„ฑ์€ ์—ฌ๊ธฐ์— ๋”ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์˜ˆ: ๊ณ„์ขŒ ์ด์ฒด ์‹œ ๋‘ ๊ณ„์ขŒ ์ž”์•ก์˜ ํ•ฉ์€ ํ•ญ์ƒ ๊ฐ™์•„์•ผ ํ•œ๋‹ค)์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค๊ณ„๋˜๊ณ  ๊ฒ€์ฆ๋˜์–ด์•ผ๋งŒ ์™„๋ฒฝํ•˜๊ฒŒ ๋ณด์žฅ๋  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ผ๊ด€์„ฑ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ๋Šฅ๊ณผ ๊ฐœ๋ฐœ์ž์˜ ์˜ฌ๋ฐ”๋ฅธ ์„ค๊ณ„๊ฐ€ ํ•ฉ์ณ์ ธ์„œ ์™„์„ฑ๋˜๋Š” ์˜์—ญ์ด๋‹ค.

 

๋งˆ์น˜๋ฉฐ

์ง€๊ธˆ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ACID๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ์›์น™์„ ์–ด๋–ป๊ฒŒ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ๋ณด์žฅํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์•˜๋‹ค. ๋‹จ์ˆœํžˆ ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์œผ๋กœ๋งŒ ์•Œ๊ณ  ์žˆ๋˜ ACID๊ฐ€, ์‹ค์ œ๋กœ๋Š” InnoDB์˜ ๋ฒ„ํผ ๊ด€๋ฆฌ ์ •์ฑ…(Steal/No-Force)์„ ๋ฐ”ํƒ•์œผ๋กœ Redo/Undo ๋กœ๊ทธ๋ผ๋Š” ์น˜์—ดํ•œ ๋ณต๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฑฐ์น˜๊ณ , MVCC์™€ ์ •๊ตํ•œ ์ž ๊ธˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์™„์„ฑ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊นŠ์€ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€, ๋™์‹œ์„ฑ ์ด์Šˆ๋‚˜ ์žฅ์•  ์ƒํ™ฉ์— ์ง๋ฉดํ–ˆ์„ ๋•Œ ๊ทผ๋ณธ์ ์ธ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ณ  ๋” ์•ˆ์ •์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•˜๋Š” ๋“ ๋“ ํ•œ ๋ฐ‘๊ฑฐ๋ฆ„์ด ๋  ๊ฒƒ์ด๋‹ค.