์ด์ ์ DB ํธ๋์ญ์
์ ๋ํ ๊ธ์ ์ ๋ฆฌํ๋ฉด์, ํน์ง ์ค ๊ฒฉ๋ฆฌ์ฑ
์ ๋ํด์๋ ์์๋ณด์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋์ญ์ ์ด ๋ ๋ฆฝ์ ์ผ๋ก ์ํ๋์ด์ผ ํ์ง๋ง, ์ผ๋ง๋ ๋ ๋ฆฝ์ ์ธ์ง์ ์ ๋์์๋ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค.
์ด๋ฅผ ๊ฒฉ๋ฆฌ ์์ค
์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ํธ๋์ญ์
์ด ๋์์ ์คํ๋ ๋, ์๋ก์ ์์
์ด ์ด๋ ์ ๋๊น์ง ๊ฒฉ๋ฆฌ๋์ด์ผ ํ๋์ง๋ฅผ ์ค์ ํ๋ ๊ธฐ์ค์ด ๋๋ค.
๊ฒฉ๋ฆฌ ์์ค์ 4๊ฐ์ง๊ฐ ์กด์ฌํ๋ฉฐ, ์ด๋ฒ ๊ธ์์๋ ๊ฒฉ๋ฆฌ์ฑ์ด ๋ฎ์(= ๋์์ฑ์ด ๋์)
์์ผ๋ก ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
READ UNCOMMITTED
๋ ์ด๋ฆ ๊ทธ๋๋ก ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๊น์ง ์ ๊ทผํ ์ ์๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
- ์ฌ์ฉ์ A๊ฐ id=51์ ๋ฉค๋ฒ๋ฅผ INSERT ํ๋ค.
- ์ฌ์ฉ์ B๊ฐ id=51์ ๋ฉค๋ฒ๋ฅผ SELECT ํ๋ค.
- ์์ง COMMIT ๋์ง ์์์์๋, ์๋กญ๊ฒ ์ถ๊ฐ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ฌ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
COMMIT์ด ๋์ง ์์๊ธฐ์, ์์ง ๋ก๊ทธ์ ๋ฐ์ดํฐ ๋ชจ๋ ๋์คํฌ์ ์ฐ์ด์ง ์์ ์ํฉ์ธ๋ฐ ์ฌ์ฉ์ B์์๋ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์์๊น?
์ด๋ ์ฌ์ฉ์ A๊ฐ ์งํ ์ค์ธ ํธ๋์ญ์ ์ด ๋ณ๊ฒฝํ ๋ฒํผ ํ์ ๋ด์ฉ์ ๊ทธ๋๋ก ์ฝ์๊ธฐ์ ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ B๊ฐ ์ฝ์ ๋ฒํผ ํ์ ๋ฐ์ดํฐ๋ฅผ
๋ํฐ ํ์ด์ง
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ฒํผ ํ์ ์๋ ๋ฐ์ดํฐ ์ค, ์์ง ๋์คํฌ์ flush๋์ง ์์ ์ํ์ ํ์ด์ง๋ฅผ ๋งํ๋ค.
์ฌ๊ธฐ์
๋ํฐ(Dirty)
๋ ์๋ณธ๊ณผ ๋ฌ๋ผ์ง ์ํ๋ฅผ ์๋ฏธํ๋ ์ฉ์ด์ด๋ค.
๋ชจ๋ ๋ํฐ ํ์ด์ง๊ฐ ์ํํ ๊ฒ์ ์๋์ง๋ง, ์ปค๋ฐ๋์ง ์์ ํธ๋์ญ์ ์ด ๋ง๋ ๋ํฐ ํ์ด์ง๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ์ผ๋ฉด ์ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ ์ํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ฌ์ฉ์ B๊ฐ ํ ํ์๋ฅผ ๋ํฐ ๋ฆฌ๋
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์์ง COMMITํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ํ์์ผ๋ก, ์์์ ๋งํ ๋ํฐ ํ์ด์ง์ ์ ๊ทผํ๋ ๊ฒ์ ํ์ฉํ ๋ ๋ฐ์ํ๊ฒ ๋๋ค.
์ฌ์ฉ์ B๊ฐ ๋ํฐ ๋ฆฌ๋๋ฅผ ํ ์ดํ์, ์ฌ์ฉ์ A์ ํธ๋์ญ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ROLLBACK์ ์ํํ๋ค๊ณ ํด๋ณด์.
- ROLLBACK -> id=51์ธ ๋ฉค๋ฒ๋ ํ ์ด๋ธ์์ ์ฌ๋ผ์ง๋ค.
- ์ฌ์ฉ์ B์ ํธ๋์ญ์ ์ ๊ณ์ ์งํ์ค
- ์กฐํํ id=51 ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฒ๋ฆฌ ๋ก์ง์ ๊ณ์ ์ํ (๊ฒฐ์ , ์ฐ๊ด ํ ์ด๋ธ INSERT ๋ฑ)
- ๋ฐ์ดํฐ ์ ํฉ์ฑ์ด ๊นจ์ง๊ฒ ๋จ
๋ํฐ ๋ฆฌ๋๋ ์กด์ฌํ์ง ์๋ ๋ฐ์ดํฐ
๋ฅผ ์ ๋ขฐํ๊ฒ ๋ง๋ ๋ค๋ ์ ์์ ์์คํ
์ ๋ฐ์ ์ ํฉ์ฑ & ๋ฌด๊ฒฐ์ฑ์ ์ฌ๊ฐํ๊ฒ ํผ์ํ ์ ์๋ค.
๋ฐ๋ผ์ READ UNCOMMITTED
๋ ๋๋ถ๋ถ์ ์์คํ
์์ ์ฌ์ฉ์ด ๊ถ์ฅ๋์ง ์์ผ๋ฉฐ, ์ต์ํ READ COMMITTED
์ด์์ ๊ฒฉ๋ฆฌ ์์ค์ ๊ถ์ฅํ๋ค.
๊ทธ๋ผ ์ด๋ ๊ฒ ์ํํ ๊ฒฉ๋ฆฌ ์์ค์ ์ธ์ ์ฐ์ด๋์ง์ ๋ํ ๊ถ๊ธ์ฆ์ด ์๊ธด๋ค.
READ UNCOMMITTED
๋ ์ ํฉ์ฑ์ด ๋ฎ์ ๋งํผ ์ผ๋ฐ์ ์ธ ์๋น์ค์์๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ง๋ง, ํน์ ๋ชฉ์ ์ ํ์ ํด โ์ฝ๊ธฐ ์ฑ๋ฅโ์ ๊ทน๋จ์ ์ผ๋ก ๋์ด๊ณ ์ถ์ ๋ ์ ํ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ชจ๋ํฐ๋ง & ํต๊ณ์ฑ ์ฟผ๋ฆฌ & ๋ก๊น
๋ฑ์ด ์์ผ๋ฉฐ, ๋ฐ์ดํฐ์์ ์ฝ๊ฐ์ ์ค์ฐจ๋ ํ์ฉํ๋ ๊ฒฝ์ฐ์ ์ฐ์ด๊ณค ํ๋ค.
READ COMMITTED
๋ ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ง ์ ๊ทผํ ์ ์๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
์ฌ์ฉ์ A๊ฐ id=50์ธ ๋ฉค๋ฒ์ ์ด๋ฆ์ MinKyu
๋ก ๋ณ๊ฒฝํ๋ ํธ๋์ญ์
์ ์งํ์ค์ด๋ผ๊ณ ํด๋ณด์.
์ ์ด๋ฏธ์ง ์์ผ๋ก๋ UPDATE
๋ฌธ์ด ์คํ๋์๊ณ , ์์ง COMMIT ์ ์ด๊ธฐ์ ๋ฒํผ ํ ๋ด์์ ์ ์ฅ๋๋ค.
๋ํ UNDO ๋ก๊ทธ์๋ ๋ณ๊ฒฝ ์ด์ ์ ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋๋ค.
์ด ์ํ์์ ์ฌ์ฉ์ B์ ํธ๋์ญ์ ์์ id=50 ๋ฉค๋ฒ์ ์ด๋ฆ์ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค๊ณ ํด ๋ณด์.
์์ง COMMIT ์ด์ ์ด๊ธฐ ๋๋ฌธ์, UNDO ๋ก๊ทธ์์ ๋ณ๊ฒฝ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ ๋ฐํํ๊ฒ ๋๋ค. ๋๋ฌธ์ ์ฌ์ฉ์ B๋ MangKyu
๋ผ๋ ์ด์ ์ ์ด๋ฆ์ ๊ฒฐ๊ณผ๋ก ๋ฐ๊ฒ ๋๋ค.
์ฆ, ๋ํฐ ํ์ด์ง๋ฅผ ์ง์ ์ฝ์ง ์๊ณ , UNDO ๋ก๊ทธ๋ฅผ ํตํด ๋ณ๊ฒฝ ์ด์ ์ ์ปค๋ฐ๋ ๋ฐ์ดํฐ ๋ฒ์ ์ ์ฝ๊ธฐ ๋๋ฌธ์ ๋ํฐ ๋ฆฌ๋๋ ๋ฐ์ํ์ง ์๋๋ค.
READ COMMITTED
๋ ๋๋ถ๋ถ์ ์์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค(MS-SQL, Oracle ๋ฑ)์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฉฐ, ๋์์ฑ๊ณผ ๋ฐ์ดํฐ ์ ํฉ์ฑ ์ฌ์ด์์ ๊ท ํ์ ์ก๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์์ฃผ ์ฌ์ฉ๋๋ค.
READ COMMITTED
๋ ๋ํฐ ๋ฆฌ๋๋ฅผ ๋ฐฉ์งํ๊ธด ํ์ง๋ง, ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ์ฌ์ฉ์ A๊ฐ id=50์ธ ๋ฉค๋ฒ์ ์ด๋ฆ์
MinKyu
๋ก ๋ณ๊ฒฝํ๋ ํธ๋์ญ์ ์ ์คํํ๋ค.- ์ฌ์ฉ์ B๊ฐ ๊ฐ์ ์์ ์ SELECT ์ฟผ๋ฆฌ๋ก ์ด๋ฆ์ ์กฐํํ๋ฉด, UNDO ๋ก๊ทธ๋ฅผ ํตํด ๋ณ๊ฒฝ ์ด์ ๊ฐ์ธ
MangKyu
๋ฅผ ๊ฒฐ๊ณผ๋ก ๋ฐ๋๋ค.- ์ดํ ์ฌ์ฉ์ A๊ฐ COMMIT์ ์ํํ๋ค.
- ์ฌ์ฉ์ B๊ฐ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ค์ ์คํํ๋ฉด, ์ด๋ฒ์ ๋ณ๊ฒฝ ํ ๊ฐ์ธ
MinKyu
๊ฐ ๋ฐํ๋๋ค.
์ด๋ ๋ฏ, ํ๋์ ํธ๋์ญ์ ๋ด์์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณต ์คํํ์์๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ํ์์
Non-repeatable Read (๋ฐ๋ณต ๋ถ๊ฐ ์ฝ๊ธฐ)
๋ผ๊ณ ํ๋ค.
์ด ๋ฌธ์ ๋ ์ดํ ๊ฒฉ๋ฆฌ ์์ค์ธ REPEATABLE READ
์ด์์์ ํด๊ฒฐํ ์ ์๋ค.
Non-repeatable Read
๊ฐ ๋ฌธ์ ๊ฐ ๋ ๋งํ ์ฌ๋ก๋ฅผ ํ์ค์ธ๊ณ์์ ๋ ์ฌ๋ ค ๋ณด์.
- A๋ผ๋ ์ฌ๋์ด ํธ์์ ์
4/30 23:59
์ ์ ์ฅ- 4์๊น์ง 1,500์์ผ๋ก ์ธ์ผํ๋ ๊ณผ์๋ฅผ ์ง๊ณ ์นด์ดํฐ๋ก ์ด๋ (ํธ๋์ญ์ ์์)
- ์ด๋ํ๋ ์ค,
5/1 00:00
์ด ๋์ด ์ธ์ผ์ด ์ข ๋ฃ๋จ (ํ ํธ๋์ญ์ ์ ์ํด ๊ฐ๊ฒฉ์ด 2,000์์ผ๋ก UPDATE ๋จ)- A๋ 1,500์์ผ๋ก ์ธ์งํ๊ณ ๊ตฌ์ ํ๋ ค ํ์ง๋ง, 2,000์์ ๊ตฌ์ ํ๊ฒ ๋จ
์ด๋ ๋ฏ ํธ๋์ญ์ ๋ด์์ ์ฒ์ ํ์ธํ ์ ๋ณด์ ์ต์ข ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ํ์์, ์ฌ์ฉ์์ ์๋์ ๋ค๋ฅธ ์ฒ๋ฆฌ๊ฐ ์ด๋ค์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋น์ฆ๋์ค ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก RDBMS์์๋ ๋ณ๊ฒฝ ์ ๋ ์ฝ๋๋ฅผ UNDO ๋ก๊ทธ์ ๋ฐฑ์ ํด๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ณ๊ฒฝ ์ /ํ์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์กด์ฌํ๊ฒ ๋๊ณ , ๋์ผ ๋ ์ฝ๋์ ๋ํด์ ์ฌ๋ฌ ๋ฒ์ ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ค๊ณ ํ์ฌ ์ด๋ฅผ MVCC
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
MVCC๋?
MVCC๋
Multi-Version Concurrency Control
์ ์ค ๋ง๋ก, ๋ค์ค ๋ฒ์ ๋์์ฑ ์ ์ด๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.์ด๋ฅผ ํ์ฉํ์ฌ ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋ ๊ฒฝ์ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ํ ์ ์์ ๋ฟ๋ง ์๋๋ผ, ์๋ก ๋ค๋ฅธ ํธ๋์ญ์ ๊ฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๊ฒ ๋๋ค.
๊ฐ๊ฐ์ ํธ๋์ญ์ ์ ์์ฐจ ์ฆ๊ฐํ๋ ๊ณ ์ ํ ํธ๋์ญ์ ๋ฒํธ๊ฐ ์กด์ฌํ๋ฉฐ, ๋ฐฑ์ ๋ ์ฝ๋์๋ ์ด๋ ํธ๋์ญ์ ์ ์ํด ๋ฐฑ์ ๋์๋์ง ํธ๋์ญ์ ๋ฒํธ๋ฅผ ํจ๊ป ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฐ์ดํฐ๊ฐ ๋ถํ์ํด์ง๋ค๊ณ ํ๋จํ๋ ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฐ๋ ๋๋ฅผ ํตํด ์ญ์ ํ๋ค.
ps.
MVCC & REDO & UNDO
์ ๋ํด์๋ ์ถํ ๋ค๋ฅธ ๊ธ์์ ์์ธํ ๋ค๋ฃฐ ์์ ์ด๋ค.
REPEATABLE READ
์์ค์ MVCC๋ฅผ ์ด์ฉํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ํ ํธ๋์ญ์
๋ด์์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ์ง๋ง, ์๋ก์ด ๋ ์ฝ๋๊ฐ ์ถ๊ฐ(INSERT)๋๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ด ๊นจ์ง ์ ์๋ค.
B ํธ๋์ญ์ ์ด ๋์ํ๋ฉด์ id๊ฐ 50์ด์์ธ ๋ ์ฝ๋๋ฅผ ์กฐํํ๋ค. ์ด ๋๋ 1๊ฑด์ ๊ฒฐ๊ณผ๊ฐ ์ ์์ ์ผ๋ก ์กฐํ๋๋ค.
ํ์ฌ Bํธ๋์ญ์
์ id๋ 10์ด๋ค. (T-ID=10)
A ํธ๋์ญ์
์์ id๊ฐ 50์ธ member์ name์ MinKyu
๋ก ์
๋ฐ์ดํธ ํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฐ๋ค.
ํ ์ด๋ธ ์์์๋ name์ด ๋ณ๊ฒฝ๋์์ผ๋, UNDO ๋ก๊ทธ ๋ด์๋ ์ ๋ฐ์ดํธ ์ด์ name์ด ๊ธฐ๋ก๋์ด ์๋ค.
ํ์ฌ Aํธ๋์ญ์
์ id๋ 12์ด๋ค. (T-ID=12)
A ํธ๋์ญ์ ์ด ์ปค๋ฐ๋์ด, name์ด ์๊ตฌ์ ์ผ๋ก ๋ณ๊ฒฝ๋์๋ค. ์์ง B ํธ๋์ญ์ ์ ์ข ๋ฃ๋์ง ์์๊ธฐ์, ๋ค์ ํ ๋ฒ ๋์ผํ ์ฟผ๋ฆฌ๋ก id๊ฐ 50์ด์์ธ member๋ฅผ ์กฐํํ๋ค.
์ปค๋ฐ๋์๊ธฐ ๋๋ฌธ์, ํ
์ด๋ธ ์์์ MinKyu
๋ผ๋ name์ ์กฐํํ ๊ฒ์ผ๋ก ์์๋์ง๋ง ๊ทธ๋ ์ง ์๊ณ ์ด์ ์ name์ธ ManKyu
๋ฅผ ์กฐํํ๋ค.
์ด๋ป๊ฒ ์ด๋ ๊ฒ ๋์ํ๋ ๊ฒ์ผ๊น?
์ด๋ B ํธ๋์ญ์ ์ด A ํธ๋์ญ์ ๋ณด๋ค ๋จผ์ ์คํ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
REPEATABLE READ
์์ค์์๋ ํธ๋์ญ์
id(๋ฒํธ)๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ ๋ณด๋ค ๋จผ์ ์คํ๋ ํธ๋์ญ์
์ ๋ฐ์ดํฐ๋ง์ ์กฐํํ๊ฒ ๋๋ค.
๋ง์ฝ ์ง๊ธ๊ณผ ๊ฐ์ด ์์ ์ดํ๋ก ์คํ๋ ํธ๋์ญ์
์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋, UNDO
๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค.
์ ๋ฆฌํ์๋ฉด B ํธ๋์ญ์ ์ id๊ฐ 10์ด๊ณ A ํธ๋์ญ์ ์ id๊ฐ 12์ด๋ฏ๋ก, ํ ์ด๋ธ์ ๋ ์ฝ๋(MinKyu)๋ฅผ ๋ฐ๋ก ์กฐํํ๋ ๊ฒ์ด ์๋๋ผ / UNDO ๋ก๊ทธ์ ๊ธฐ๋ก๋ ๋ฐ์ดํฐ(ManKyu)๋ฅผ ์กฐํํ๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์๋, ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ฝ์
ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? A ํธ๋์ญ์
์์ id๊ฐ 51์ด๊ณ name์ด Martin
์ธ ๋ ์ฝ๋๋ฅผ ์ฝ์
ํ๊ณ ์ปค๋ฐํ์๋ค.
์ด๋ B ํธ๋์ญ์ ์์ id๊ฐ 50 ์ด์์ธ ๋ ์ฝ๋๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฐ๋ค. ํ์ฌ ํ ์ด๋ธ ์์๋ id๊ฐ 50 ์ด์์ธ ๋ ์ฝ๋๊ฐ 2๊ฐ์ด๋ฏ๋ก 2๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒ์ผ๋ก ์์๋์ง๋ง ๊ทธ๋ ์ง ์๊ณ 1๊ฑด๋ง ์กฐํ๋๋ค.
์ด ๋ํ ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ํธ๋์ญ์ id๋ฅผ ํตํด์, ์์ ์ดํ์ ์ถ๊ฐ๋ ๋ฐ์ดํฐ๋ ๋ฌด์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ๋ง์ฝ์ ํธ๋์ญ์ id๊ฐ ์กด์ฌํ์ง ์์์, ์ ํ ๊ด๊ณ๋ฅผ ์ถ์ ํ์ง ๋ชป ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
๊ทธ๋ ๋ค๋ฉด ์์ฒ๋ผ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ UNDO ๋ก๊ทธ์์ ์กฐํํ๋ ์กฐ์น๋ฅผ ์ทจํ ์๊ฐ ์๋ค.
๋๋ฌธ์ ํ
์ด๋ธ ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ฝ๊ฒ ๋๊ณ , ๊ฒฐ๊ณผ๋ก 2๊ฑด์ ๋ ์ฝ๋ ์กฐํํ๊ฒ ๋๋ค.
์ด๋ฌํ ์ํฉ์ Phantom Read(ํฌํ
๋ฆฌ๋)
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
REPEATABLE READ
์์ค์์๋ ์๋ก์ด ๋ ์ฝ๋์ ์ถ๊ฐ๊น์ง๋ ๋ง์ง ์๋๋ค.
๋ฐ๋ผ์ SELECT๋ก ์กฐํํ๋ ๊ฒฝ์ฐ ํธ๋์ญ์
์ด ๋๋๊ธฐ ์ ์ ๋ค๋ฅธ ํธ๋์ญ์
์ ์ํด ์ถ๊ฐ๋ ๋ ์ฝ๋๊ฐ ๋ฐ๊ฒฌ๋ ์ ์๋๋ฐ, ์ด๋ฅผ Phantom Read
๋ผ๊ณ ํ๋ค.
ํ์ง๋ง
MVCC
๋๋ถ์ ์ผ๋ฐ์ ์ธ ์กฐํ์์Phantom Read
๋ ๋ฐ์ํ์ง ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ ํ ๊ฒฝ์ฐ์์ ํฌํ ๋ฆฌ๋๊ฐ ๋ฐ์ํ ์ ์์๊น?
๋ฝ(์ ๊ธ)
์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์ ํฌํ
๋ฆฌ๋๊ฐ ๋ฐ์ํ ์ ์๋๋ฐ, MySQL์๋ ํน์ํ ๊ฐญ ๋ฝ
์ด๋ผ๋ ์ฅ์น๊ฐ ์์ผ๋ฏ๋ก ๋ค๋ฅธ RDBMS๋ถํฐ ์ดํด๋ณด๋ ค๊ณ ํ๋ค.
์์ ์์์ ๋์ผํ๊ฒ B ํธ๋์ญ์
์์ id๊ฐ 50์ด์์ธ ๋ฉค๋ฒ๋ฅผ ์กฐํํ๋ ค๊ณ ํ๋ค. ์ฌ๊ธฐ์ ์ฐจ์ด์ ์ SELECT
๊ฐ ์๋๋ผ, SELECT FOR UPDATE
๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๋ค.
SELECT FOR UPDATE?
SELECT FOR UPDATE
๊ตฌ๋ฌธ์ ์กฐํํ๋ ํ(row) ์ ๋ํด๋ฐฐํ์ ๋ฝ(X-lock)
์ ๊ฑฐ๋ ๋น๊ด์ ์ ๊ธ ๋ฐฉ์์ด๋ค.
์ด ๋ฝ์ด ๊ฑธ๋ฆฐ ๋ ์ฝ๋๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฐ๊ธฐ(INSERT, UPDATE, DELETE) ์์ ์ ํ ์ ์์ง๋ง, ์ฝ๊ธฐ(SELECT) ์์ ์ ๊ฐ๋ฅํ๋ค.์ด๋ฌํ ๋ฝ์ ํธ๋์ญ์ ์ด ์ปค๋ฐ ๋๋ ๋กค๋ฐฑ๋ ๋, ์ฆ ์ข ๋ฃ๋ ๋ ํด์ ๋๋ค.
์ฌ๊ธฐ์ A ํธ๋์ญ์ ์์ id๊ฐ 51์ธ ๋ฐ์ดํฐ๋ฅผ INSERTํ๋ค. ํ์ฌ ๋ฝ์ id๊ฐ 50์ธ ๋ ์ฝ๋์๋ง ๊ฑธ๋ ค ์๊ธฐ ๋๋ฌธ์, ์ ์์ ์ผ๋ก ์ฝ์ ์ด ๋๋ค.
์ดํ์ B ํธ๋์ญ์
์์ id๊ฐ 50 ์ด์์ธ member๋ฅผ ์กฐํํ๋ฉด, ์ด๋ฒ์๋ 1๊ฑด์ด ์๋ 2๊ฑด์ ๋ ์ฝ๋๋ฅผ ์กฐํํ๊ฒ ๋๋ค.
๋ชจ๋ฅด๋ ์ฌ์ด์ ๋ ์ฝ๋๊ฐ ์๊ธฐ๊ฑฐ๋ ์ฌ๋ผ์ง๋, ํฌํ
๋ฆฌ๋
๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
์ด๋ฒ์๋ ์ MVCC๋ก ํฌํ ๋ฆฌ๋๋ฅผ ๋ฐฉ์งํ์ง ๋ชป ํ์๊น?
SELECT๊ฐ ์๋ SELECT FOR UPDATE, ์ฆ ์ ๊ธ ์๋ ์ฝ๊ธฐ๋ก ์กฐํํ๋ ๊ฒฝ์ฐ์๋ UNDO ๋ก๊ทธ๊ฐ ์๋ ํ ์ด๋ธ์์ ๋ฐ๋ก ์กฐํ๊ฐ ์ํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๊ธ ์๋ ์ฝ๊ธฐ
๋ ํ
์ด๋ธ์ ๋ณ๊ฒฝ์ด ์ผ์ด๋์ง ์๊ฒ ํ๊ธฐ ์ํด์, ํ
์ด๋ธ์ ์ ๊ธ์ ๊ฑธ๊ณ -> ํ
์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค.
UNDO ๋ก๊ทธ์ ์ ๊ธ์ ๊ฑธ๊ณ -> UNDO ๋ก๊ทธ์์ ์กฐํํ๋ฉด ๋์ง ์์๊น?
๊ทธ๋ด ์๋ ์๋ค. UNDO
๋ก๊ทธ๋ Append Only
ํํ๋ก, ์ ๊ธ ๊ธฐ๋ฅ์ด ์์ด ๋์์ฑ ์ ์ด๊ฐ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ฌธ์ ์ ๊ธ ์๋ ์ฝ๊ธฐ(SELECT FOR UPDATE or SELECT FOR SHARE)๋ก ์กฐํํ๋ ๊ฒฝ์ฐ์๋, UNDO ๋ก๊ทธ๊ฐ ์๋ ํ
์ด๋ธ์์๋ง ์กฐํ๋ฅผ ํ๊ฒ ๋๊ณ ์ด๋ก ์ธํด ํฌํ
๋ฆฌ๋
๋ฅผ ์ผ๊ธฐํ ์ ์๋ค.
MySQL์๋ ํน์ํ ๊ฐญ ๋ฝ
์ด๋ผ๋ ์ฅ์น๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์, ์์ ๊ฐ์ ์ํฉ์์๋ ํฌํ
๋ฆฌ๋๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
B ํธ๋์ญ์ ์์ SELECT FOR UPDATE๋ก ์กฐํํ๋ ๊ฒฝ์ฐ์, MySQL์ ์๋์ ๊ฐ์ด ๋ฝ์ ๊ฑด๋ค.
- id๊ฐ 50์ธ ๋ ์ฝ๋์ ๋ํด์๋
๋ ์ฝ๋ ๋ฝ
- id๊ฐ 50๋ณด๋ค ํฐ ๋ฒ์๋ ๊ฐญ ๋ฝ์ผ๋ก
๋ฅ์คํธ ํค ๋ฝ
ps.
๋ ์ฝ๋ ๋ฝ, ๋ฅ์คํธ ํค ๋ฝ, ๊ฐญ ๋ฝ
๋ฑ์ ์ถํ ๋ค๋ฅธ ๊ธ์์ ์์ธํ ๋ค๋ฃจ๋ ค๊ณ ํ๋ค.
์ฌ๊ธฐ์ A ํธ๋์ญ์
์ด id๊ฐ 51์ธ member๋ฅผ INSERT ํ๋ ค๊ณ ์๋ํ๋ค๋ฉด, B ํธ๋์ญ์
์ด ์ข
๋ฃ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค.
๋ง์ฝ ๋๊ธฐ ์๊ฐ์ด ๋๋ฌด ๊ธธ์ด์ง๋ค๋ฉด, ๋ฝ ํ์์์
์ด ๋ฐ์ํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก MySQL์ REPEATABLE READ์์๋ ํฌํ ๋ฆฌ๋๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
ํ์ง๋ง ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ์ผํ๊ฒ ๋ฐ์ํ ์ ์๋ค.
B ํธ๋์ญ์ ์์ SELECT ๋ฌธ์ผ๋ก ์กฐํ๋ฅผ ํ๋ค. ์ด ๋๋ ๋ฝ์ด ๊ฑธ๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์, A ํธ๋์ญ์ ์์ INSERT๋ฅผ ์ํํ๊ณ ์ปค๋ฐ๊น์ง ์ ์์ ์ผ๋ก ์๋ฃ๋๋ค.
์ดํ B ํธ๋์ญ์ ์์ SELECT๊ฐ ์๋ SELECT FOR UPDATE ๋ฌธ์ผ๋ก ์กฐํ๋ฅผ ์๋ํ๋ค. ์ด ๋๋ UNDO ๋ก๊ทธ๊ฐ ์๋, ํ ์ด๋ธ ์์ฒด์์ ์กฐํ๋ฅผ ํ๋ฏ๋ก 1๊ฑด์ด ์๋๋ผ 2๊ฑด์ด ์กฐํ๋์ด ํฌํ ๋ฆฌ๋๊ฐ ๋ฐ์ํ๋ค.
์ง๊ธ๊น์ง ๋์จ ๋ด์ฉ์ ์ ๋ฆฌํ์๋ฉด ์๋์ ๊ฐ๋ค.(MySQL ๊ธฐ์ค)
SELECT FOR UPDATE -> SELECT
- ๊ฐญ ๋ฝ์ผ๋ก ์ธํด์ ํฌํ ๋ฆฌ๋ ๋ฐ์ โ
SELECT FOR UPDATE -> SELECT FOR UPDATE
- ๊ฐญ ๋ฝ์ผ๋ก ์ธํด์ ํฌํ ๋ฆฌ๋ ๋ฐ์ โ
SELECT -> SELECT
- MVCC๋ก ์ธํด์ ํฌํ ๋ฆฌ๋ ๋ฐ์ โ
SELECT -> SELECT FOR UPDATE
- MVCC ๋์ ๋ถ๊ฐ, ์ ์ผํ๊ฒ ํฌํ ๋ฆฌ๋ ๋ฐ์ โญ๏ธ
๊ธ ์ด๋ฐ๋ถ์์, ๊ฒฉ๋ฆฌ์ฑ์ด ๋ฎ์ ์์ผ๋ก ์ ๋ฆฌ๋ฅผ ํ๋ค๊ณ ํ์๋ค.
๊ทธ๋ ๊ธฐ์ ์ด๋ฒ์ ์ ๋ฆฌํ SERIALIZABLE
์ ๊ฒฉ๋ฆฌ์ฑ์ด ๊ฐ์ฅ ๋๊ณ / ๋์์ฑ์ด ๊ฐ์ฅ ๋ฎ์ ์์ค์ด๋ผ๊ณ ํ ์ ์๋ค.
์ด๋ฆ ๊ทธ๋๋ก ํธ๋์ญ์ ์ ์์ฐจ์ ์ผ๋ก ์คํ์ํจ๋ค๋ ๋ป์ด๋ค. ํด๋น ์์ค์์๋ ์ฌ๋ฌ ํธ๋์ญ์ ์์ ๋์ผํ ๋ ์ฝ๋์ ์ ๋๋ก ๋์ ์ ๊ทผํ ์๊ฐ ์๋ค.
๋๋ฌธ์ ์์์ ์ธ๊ธํ์๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ๊ณผ ๊ด๋ จํ ๋ฌธ์ ๋ค์ ๋ฐ์ํ์ง ์๋๋ค.
๊ทธ๋ ์ง๋ง ๋์ ์ ๋์์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๊ณ , ์ด๋ ์ฒ๋ฆฌ ์๋ ์ ํ์ ์ํฅ์ ์ฃผ๊ฒ ๋๋ค.
์ REPEATABLE READ ์์ค์ ์ค๋ช ํ๋ฉด์, SELECT FOR UPDATE ๋๋ SELECT FOR SHARE ๋ฌธ์์๋ ๋ฝ์ ๊ฑธ์ง๋ง, ์์ํ SELECT ๋ฌธ์์๋ ๊ทธ๋ ์ง ์์์ ์ธ๊ธํ์๋ค.
ํ์ง๋ง SERIALIZABLE ์์ค์์๋,
์์ํ SELECT ์์
์์๋ ๋์ ๋ ์ฝ๋์ ๋ฅ์คํธ ํค ๋ฝ์ย ์ฝ๊ธฐ ์ ๊ธ(๊ณต์ ๋ฝ, Shared Lock)์ผ๋ก ๊ฑด๋ค.
๋ฐ๋ผ์ ํ ํธ๋์ญ์ ์์ SELECT๋ง ํ๋ ๊ฒฝ์ฐ์๋, ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ๋์ ๋ ์ฝ๋์ ๋ํด ์ ๋ ์ถ๊ฐ/์์ /์ญ์ ํ ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ด ๋ง์ด ๋จ์ด์ง๊ฒ ๋๋ค.