๐ŸŒ CS & Infra/Database

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

devCloud 2026. 4. 1. 17:44
728x90

๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค MVCC ์‹ค์ „: Lost Update์™€ Write Skew ํ•ด๊ฒฐ

1. MVCC๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋‹ค์ค‘ ๋ฒ„์ „ ๋™์‹œ์„ฑ ์ œ์–ด(Multi-Version Concurrency Control)๋Š” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์‹œ ํ•ด๋‹น ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท(๋ฒ„์ „)์„ ๋ณด์—ฌ์ฃผ์–ด ๋™์‹œ์„ฑ์„ ๋†’์ด๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์›์น™์€ "์ฝ๊ธฐ๋Š” ์“ฐ๊ธฐ๋ฅผ ๋ง‰์ง€ ์•Š๊ณ , ์“ฐ๊ธฐ๋Š” ์ฝ๊ธฐ๋ฅผ ๋ง‰์ง€ ์•Š๋Š”๋‹ค"๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹: ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์›๋ณธ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ , ์ด์ „ ๋ฒ„์ „์„ ๋ณ„๋„ ์˜์—ญ(MySQL์˜ Undo Log ๋“ฑ)์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‹œ๋งˆ๋‹ค System ID๋‚˜ Transaction ID๋ฅผ ์ €์žฅํ•ด ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ๋ฒ„์ „์ธ์ง€ ํŒ๋ณ„ํ•ฉ๋‹ˆ๋‹ค.


2. ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation Level)์— ๋”ฐ๋ฅธ ๋™์ž‘

๊ฒฉ๋ฆฌ ์ˆ˜์ค€ MVCC ๋™์ž‘ ๋ฐฉ์‹
Read Uncommitted MVCC๋ฅผ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ Dirty Read ๋ฐœ์ƒ
Read Committed ์ฟผ๋ฆฌ๊ฐ€ ์‹œ์ž‘๋œ ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท์„ ์ฝ์Œ (SELECT๋งˆ๋‹ค ๊ฐฑ์‹ )
Repeatable Read ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋œ ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท์„ ๋๊นŒ์ง€ ์œ ์ง€
Serializable ๊ฐ€์žฅ ์—„๊ฒฉํ•จ. ์ฃผ๋กœ Locking์ด๋‚˜ SSI๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ

Consistent Read: ํŠน์ • ์‹œ์ ์˜ ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. MySQL์€ ์ด๋ฅผ Consistent Non-locking Read๋ผ ๋ถ€๋ฅด๋ฉฐ, ๋กค๋ฐฑ ์‹œ ์—ฐ์‡„ ๋ณต๊ตฌ ๋ถˆ๋Šฅ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ปค๋ฐ‹ ์‹œ์ ์—๋งŒ Write Lock์„ ํ•ด์ œํ•˜๋Š” ํšŒ๋ณต ๊ฐ€๋Šฅ์„ฑ(Recoverability)์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.


3. Lost Update ํ•ด๊ฒฐ: Locking Read

Repeatable Read์—์„œ๋„ MVCC๋งŒ์œผ๋กœ๋Š” Lost Update(์—…๋ฐ์ดํŠธ ์œ ์‹ค)๋ฅผ ๋ง‰์ง€ ๋ชปํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฝ์„ ๊ฑฐ๋Š” Locking Read๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํƒ€์  ๋ฝ (SELECT ... FOR UPDATE): X-Lock ํš๋“. ํƒ€ ํŠธ๋žœ์žญ์…˜์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ชจ๋‘ ์ฐจ๋‹จ.

๊ณต์œ  ๋ฝ (SELECT ... FOR SHARE): S-Lock ํš๋“. ํƒ€ ํŠธ๋žœ์žญ์…˜์˜ ์ฝ๊ธฐ๋Š” ํ—ˆ์šฉํ•˜๋‚˜ ์“ฐ๊ธฐ ์ฐจ๋‹จ.

โ€ป MySQL ํŠน์ง•: Locking Read ์‹œ ์Šค๋ƒ…์ƒท์ด ์•„๋‹Œ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ(Latest Committed Data)๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.


4. Write Skew(์“ฐ๊ธฐ ์™œ๊ณก) ํ˜„์ƒ๊ณผ ํ•ด๊ฒฐ

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

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
1. Locking Read ์‚ฌ์šฉ: ์กฐํšŒ ์‹œ์ ์— ๋ฝ์„ ๊ฑธ์–ด ํŠธ๋žœ์žญ์…˜์„ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.
2. ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์ƒํ–ฅ: Serializable ๋ ˆ๋ฒจ์„ ์‚ฌ์šฉํ•ด ์ด์ƒ ํ˜„์ƒ์„ ์ž๋™ ๊ฐ์ง€ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.


5. MySQL vs PostgreSQL ๋™์ž‘ ์ฐจ์ด

๋น„๊ต ํ•ญ๋ชฉ MySQL (InnoDB) PostgreSQL
Locking Read ์‹œ์  ๋ฝ ํ•ด์ œ ์‹œ๊นŒ์ง€ ๋Œ€๊ธฐ ํ›„ ์ตœ์‹  ์ปค๋ฐ‹ ๋ฐ์ดํ„ฐ ์ฝ์–ด ์ง„ํ–‰ ๋ฝ ๋Œ€๊ธฐ ํ›„ ํ–‰์ด ๋จผ์ € ์ˆ˜์ •/์ปค๋ฐ‹๋˜์—ˆ๋‹ค๋ฉด ์—๋Ÿฌ(Rollback) ๋ฐœ์ƒ
์ถฉ๋Œ ์ฒ˜๋ฆฌ ์„ ํ–‰ ๋ฝ ์šฐ์„ , ํ›„ํ–‰์€ ์ตœ์‹  ๊ฐ’์„ ๋ณด๊ณ  ํŒ๋‹จ First-updater-wins: ๋จผ์ € ์‹œ๋„ํ•œ ์ชฝ ์„ฑ๊ณต, ๋‚˜๋จธ์ง€๋Š” ์‹คํŒจ
Serializable ๊ตฌํ˜„ SELECT๋ฅผ FOR SHARE๋กœ ์ž๋™ ๋ณ€ํ™˜ (๋ฝ ๊ธฐ๋ฐ˜) SSI(์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ์ถ”์ ) ๋ฐฉ์‹ ์‚ฌ์šฉ (MVCC ๊ธฐ๋ฐ˜)

6. Q&A ๋ฐ ์š”์•ฝ

Q: ํŠน์ • ํŠธ๋žœ์žญ์…˜์—๋งŒ Read Committed ์„ค์ •์ด ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?
๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ฆฌํฌํŠธ ์ถœ๋ ฅ์ฒ˜๋Ÿผ ์†๋„๊ฐ€ ์ค‘์š”ํ•œ ํŠน์ˆ˜ ์ƒํ™ฉ์—์„œ๋งŒ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์ •ํ•ฉ์„ฑ์ด ๊นจ์งˆ ์œ„ํ—˜์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ตœ์ข… ์š”์•ฝ

  • MVCC๋Š” ์„ฑ๋Šฅ์ด ์ข‹์ง€๋งŒ Repeatable Read์—์„œ๋„ Lost Update/Write Skew๋Š” ๋ฐœ์ƒํ•œ๋‹ค.
  • ๊ฒฐ์ œ๋‚˜ ์žฌ๊ณ  ๊ด€๋ฆฌ ๋กœ์ง์€ ๋ฐ˜๋“œ์‹œ FOR UPDATE๋ฅผ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ DB๋ณ„ Serializable ํŠน์„ฑ์„ ์ˆ™์ง€ํ•ด์•ผ ํ•œ๋‹ค.
  • ์‚ฌ์šฉ ์ค‘์ธ RDBMS์˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ์„ธ๋ถ€ ๊ตฌํ˜„์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ •์  ์„ค๊ณ„์˜ ํ•ต์‹ฌ์ด๋‹ค.
728x90

'๐ŸŒ CS & Infra > Database' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Database] ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ (Isolation Level)  (0) 2026.04.03