์ง๋ ์๊ฐ์ lock๊ณผ lock-based concurrency control์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
lock์ ๊ธฐ๋ฐ์ผ๋ก concurrency control์ ๊ตฌํํ๊ณ ์ ํ์๋๋ฐ lock์ ์ฌ์ฉํ๊ธฐ๋ง ํด์๋ deadlockํ์์ด ๋ฐ์ํ์์ต๋๋ค.
๊ทธ๋์ ์ต์ด์ unlock operation ์ ๊น์ง๋ locking operation๋ง ์ฌ์ฉํ๋ 2PL protocol์ ์ ์ฉํ lock-based concurrency control์ ๊ตฌํํ๊ฒ ๋ฉ๋๋ค.
2PL protocol์๋ conservative 2PL, strict 2PL, strong strict 2PL์ด ์์์ต๋๋ค.
ํ์ง๋ง 2PL protocol์ ์ ์ฉํ lock-based concurrency control์ ์๋ก ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ฐ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋ read-read ์์ ๋ง ํ์ฉํ๊ธฐ ๋๋ฌธ์
์ ์ฒด DB ์ฒ๋ฆฌ๋์ด ๋ฎ์์ ธ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด MVCC๋ฅผ ๊ฐ๋ฐํ๊ฒ ๋์๋ค๊ณ ์ง๋ ํฌ์คํ ์์ ์์๋ณด์์ต๋๋ค.
์ค๋์ MVCC์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
MVCC๋ lock์ ์ฌ์ฉํฉ๋๋ค.
ํ์ง๋ง 2PL protocol์์ read-lock๊ณผ write-lock์ ๊ด๊ณ๋ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
read-lock | write-lock | |
---|---|---|
read-lock | O | X |
write-lock | X | X |
MVCC์์ read-lock๊ณผ write-lock์ ๊ด๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
read-lock | write-lock | |
---|---|---|
read-lock | O | O |
write-lock | O | X |
๊ฐ์ ๋ฐ์ดํฐ์ ๋ํด์ ์๋ก ๋ค๋ฅธ ํธ๋์ญ์ ์ด write-write ํ๋ ๊ฒฝ์ฐ์๋ง block๋๊ณ ๋๋จธ์ง ๊ฒฝ์ฐ์๋ ํ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ํธ๋์ญ์ ์ด 2PL lock-based concurrency control๋ณด๋ค ๋์ต๋๋ค.
์์ ๋ฅผ ๋ค์ด MVCC๋ฅผ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
x=10
tx1. x๋ฅผ ์ฝ๋๋ค.
A. read(x)
tx2. x๋ฅผ 50์ผ๋ก ๋ฐ๊พผ๋ค.
A. write-lock(x)
B. write(x=50)
๋ค์๊ณผ ๊ฐ์ schedule์ด ์์ต๋๋ค.
write-lock(tx2,x) - write(tx2,x=50) - read(tx1,x) - commit2 - unlock(x)
tx2๊ฐ x์ ๋ํ ์ฐ๊ธฐ ์์ ์ ํ๊ธฐ ์ํด write-lock์ ์ทจ๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ x=50 ์ฐ๊ธฐ ์์ ์ ํฉ๋๋ค.
MVCC๋ snapshot์ผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๊ด๋ฆฌํฉ๋๋ค.
tx2๊ฐ ์์ ํ x=50์ ๋ฐ๋ก ๋์คํฌ์ ์ ์ฅํ๋ ๊ฒ์ด ์๋, ์ด ๋ณํ๋ฅผ snapshot์ผ๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ tx1์ด x๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ํน์ง์ด ์๋๋ฐ MVCC๋ commit๋ ๋ฐ์ดํฐ๋ง ์ฝ๋๋ค๋ ๊ฒ์ ๋๋ค.
MVCC๊ฐ ์ ์ฉ๋๋ฉด readํ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฝ ์์ด ๋์ํฉ๋๋ค.
tx2๊ฐ ์ฐ๊ธฐ ์์ ์ ํ ๊ฒ์ด ๋์คํฌ์ ์ ์ฉ๋ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๋์ x=10์ commit๋ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ x=10์ ์ฝ์ ๊ฒ์ ๋๋ค.
๊ทธ ํ์ tx2๊ฐ commit์ ํ๊ฒ ๋๋ฉด์ tx2์์ ์์ ํ x=50์ด ๋์คํฌ์ ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ x์ ๋ํ lock์ ๋ฐํํฉ๋๋ค.
lock์ ์ทจ๋ํ๊ณ ๋ฐํํ๋ ์์ ์ RDBMS๊ฐ ํด์ฃผ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ผ๋ก์ ์์ ์์ lock์ ์ทจ๋ํ๊ฑฐ๋ ๋ฐํํ๋ operation์ schedule์์ ์ ์ง ์๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ commitํ ํ์ lock์ ๋ฐํํ๋ ์ด์ ๋ recoverability๋ฅผ ์ํด์ ์ ๋๋ค.
recoverability ํฌ์คํ ์๋ ์๊ฐ๋์ด ์์ง๋ง,
recoverable schedule์ commit๋์ง ์์ txA๊ฐ writeํ ๋ฐ์ดํฐ์ ๋ํด txB๊ฐ read๋ฅผ ํ๋ค๋ฉด txA๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ๊น์ง txB๋ ์ข ๋ฃํ์ง ์๋ schedule์ ๋๋ค.
recoverable schedule ์ค ๋ ์๊ฒฉํ schedule์ด ์์ต๋๋ค.
cascadeless schedule์ ๊ทธ ์ด๋ค tx๋ commit๋์ง ์์ tx๊ฐ writeํ ๋ฐ์ดํฐ๋ readํ์ง ์๋ schedule์ ๋๋ค.
commitํ ๋ฐ์ดํฐ๋ง ์ฝ์ต๋๋ค.
๋ ์๊ฒฉํ strict schedule๋ ์์ต๋๋ค.
strict schedule์ ๊ทธ ์ด๋ค tx๋ commit๋์ง ์์ tx๊ฐ writeํ ๋ฐ์ดํฐ๋ readํ์ง๋ writeํ์ง๋ ์๋ schedule์ ๋๋ค.
commitํ ๋ฐ์ดํฐ์ ๋ํด์๋ง ์ฝ๊ธฐ, ์ฐ๊ธฐ ์์ ์ ํฉ๋๋ค.
์ด๊ฑธ ๋ณด๋ฉด lock์ commitํ ํ์๋ง lock์ ๋ฐํํ๋ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.
๋ค์ ๋์์์,
์ด๋ ๊ฒ ๋ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ฝ์ด ์ด ์์ ์์ tx1์ด x๋ฅผ ํ๋ฒ ๋ ์ฝ๋ read์์ ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
๊ทธ๋ฌ๋๊น tx1์ด x๋ฅผ ๋ ๋ฒ ์ฝ๋๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ง์ง๋ง read(tx1, x)๋ ์ด๋ค ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋ ๊น์?
์ด๊ฑด ํธ๋์ญ์ isolation level์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
MVCC๋ commit๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. read uncommitted level์์๋ ๋ณดํต MVCC๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค.
MySQL์์๋ MVCC๊ฐ ์ ์ฉ๋๋ isolation level์ read committed์ repeatable read์
๋๋ค.
PostgreSQL์์๋ read uncommitted level์ด์ด๋ read committed level์ฒ๋ผ ๋์ํฉ๋๋ค.
๋ง์ฝ tx1์ isolation level์ด read commited๋ผ๋ฉด readํ๋ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์ commit๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ commit๋ x=50์ ์ฝ์ด์ฌ ๊ฒ์ ๋๋ค.
MySQL, PostgreSQL ๋ ๋ค ์ด๋ ๊ฒ read commited์์ ์ด๋ ๊ฒ ๋์ํฉ๋๋ค.
๋ง์ฝ tx1์ isolatio level์ด repeatable read๋ผ๋ฉด ํธ๋์ญ์ ์์ ์๊ฐ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์ commit๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ tx1 ์์ ์ ์ commit๋ x=10์ ๊ทธ๋๋ก ๋ค์ ์ฝ์ด์ฌ ๊ฒ์ ๋๋ค.
MySQL, PostgreSQL ๋ ๋ค ์ด๋ ๊ฒ repeatable read์์ ์ด๋ ๊ฒ ๋์ํฉ๋๋ค.
repeatable read๊ฐ ๋์ํ๋ ๋ฐฉ์์ RDBMS๋ง๋ค ๋ค๋ฅผ ์๋ ์์ต๋๋ค. ์ค๋ช ์ ํธ๋์ญ์ ์์ ์๊ฐ ๊ธฐ์ค์ผ๋ก ์ค๋ช ํ์์ง๋ง,
์ด๋ค RDBMS๋ ํธ๋์ญ์ ์์ ์ต์ด์ read๊ฐ ๋ฐ์ํ ์์ ์ ๊ธฐ์ค์ผ๋ก ํ ์๋ ์๊ณ , ๊ทธ ํธ๋์ญ์ ์์ read๋ write๋ ์ต์ด์ operation์ด ๋ฐ์ํ ์์ ์ ๊ธฐ์ค์ผ๋ก ํ ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฌ์ฉํ๋ RDBMS์ ๋งค๋ด์ผ์ ํ์ธํด๋ณด์ ์ผ ํฉ๋๋ค.
MVCC๋ ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ํน์ ์์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์ commit๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
ํน์ ์์ ์ isolation level์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
์๋ก ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ฐ์ ๋ฐ์ดํฐ์ ๋ํ read-write ์์ ์ ์๋ก blockํ์ง ์์ต๋๋ค.
๋ํ ๋ฐ์ดํฐ ๋ณํ ์ด๋ ฅ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์ ์ฅ๊ณต๊ฐ์ ์ฌ์ฉํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋ณํ๋๋ค๊ณ ๋ฐ๋ก ๋์คํฌ์ ์ฐ๋ ๊ฒ์ด ์๋ ๋ณํ๋ ์ด๋ ฅ์ผ๋ก ๊ฐ์ง๊ณ ์๋ค๊ฐ commitํ๋ฉด ๊ทธ ๋ณํ๋ ๋ด์ฉ์ ๋์คํฌ์ ์๋๋ค.
์์ฆ RDBMS๋ ๋๋ถ๋ถ MVCC๋ฅผ ์ฌ์ฉํด์ RDBMS๋ฅผ ๊ตฌํํฉ๋๋ค.
์ถ๊ฐ๋ก MySQL์์๋ ํน์ ์์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์ commit๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ฒ์ consistent read๋ผ๊ณ ํฉ๋๋ค.
๋ค์ ํฌ์คํ ์์๋ ๋ฐ์ํ ์ ์๋ ์ด์ ํ์์ ๋ํด์ MVCC๋ฅผ ์ ์ฉํ RDBMS๋ง๋ค ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง, serializable level์์๋ ์ด๋ป๊ฒ ๋์ํ๋ ์ง์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.