๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค 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์ ๊ณต์ ๋ฌธ์๋ฅผ ํตํด ์ธ๋ถ ๊ตฌํ์ ํ์ธํ๋ ๊ฒ์ด ์์ ์ ์ค๊ณ์ ํต์ฌ์ด๋ค.
'๐ CS & Infra > Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Database] ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค (Isolation Level) (0) | 2026.04.03 |
|---|