Transaction์ ์ด๋ฏธ ๋ธ๋ก๊น ํด๋จ์ผ๋ ๋ฐ๋ก ๊ฒฉ๋ฆฌ์์ค์ผ๋ก ๋์ด๊ฐ๋ณด์!
ํธ๋์ญ์
์ ๊ฒฉ๋ฆฌ ์์ค์ด๋?
๋์์ ์ฌ๋ฌ ํธ๋์ญ์
์ด ์ฒ๋ฆฌ๋ ๋, ํน์ ํธ๋์ญ์
์ด ๋ค๋ฅธ ํธ๋์ญ์
์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๋๋ก ํ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์
๋๋ค.
๊ฒฉ๋ฆฌ ์์ค์ ๋ค์๊ณผ ๊ฐ์ด 4๊ฐ์ง๋ก ์ ์ํ ์ ์์ต๋๋ค.
์์๋๋ก READ UNCOMMITTED์ ๊ฒฉ๋ฆฌ ์์ค์ด ๊ฐ์ฅ ๋ฎ๊ณ SERIALIZABLE์ ๊ฒฉ๋ฆฌ ์์ค์ด ๊ฐ์ฅ ๋์ต๋๋ค. ๊ฒฉ๋ฆฌ ์์ค์ด ๋์์ง์๋ก MySQL ์๋ฒ์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋ง์ด ๋จ์ด์ง ๊ฒ์ผ๋ก ์๊ฐํ๋ ์ฌ์ฉ์๊ฐ ๋ง์๋ฐ, ์ฌ์ค ๊ทธ๋ ์ง ์์ต๋๋ค.
SERIALIZABLE ๊ฒฉ๋ฆฌ ์์ค์ด ์๋๋ผ๋ฉด ํฌ๊ฒ ์ฑ๋ฅ์ ๊ฐ์ ์ด๋ ์ ํ๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
"DIRTY READ"๋ผ๊ณ ๋ ํ๋ "READ UNCOMMITTED"๋ ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๊ณ , SERIALIZABLE ์ญ์ ๋์์ฑ์ด ์ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์๋ ํ๋ ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ๋ผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์
๋๋ค.
SQL-92 ๋๋ SQL-99 ํ์ค์ ๋ฐ๋ฅด๋ฉด REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ InnoDB์์๋ ๋ ํนํ ํน์ฑ ๋๋ฌธ์ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ค๋ผํด์ ๊ฒฝ์ฐ ์ฃผ๋ก READ COMMITTED์, MySQL์ ๊ฒฝ์ฐ REPEATABLE READ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ฒฉ๋ฆฌ ์์ค์์๋ ์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฐ ํธ๋์ญ์ ์์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด COMMIT์ด๋ ROLLBACK ์ฌ๋ถ์ ์๊ด ์์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณด์ฌ์ง๊ฒ ๋ฉ๋๋ค. ์ ๊ทธ๋ฆผ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฌ์ฉ์ B๊ฐ ์คํํ๋ SELECT ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ์ด๋ ํ ์ํฅ์ ๋ฏธ์น๋์ง ๋ณด์ฌ์ฃผ๋ ์์์ ๋๋ค.
READ UNCOMMITTED ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฐ ํธ๋์ญ์ ์์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด COMMIT ์ด๋ ROLLBACK ์ฌ๋ถ์ ์๊ด ์์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณด์ฌ์ง๊ฒ ๋ฉ๋๋ค.
์ฌ์ฉ์ A๊ฐ INSERTํ ๋ด์ฉ์ด ์ปค๋ฐ์ด ๋์ง ์์์์๋ ์ฌ์ฉ์ B๋ ์กฐํ๊ฐ ๊ฐ๋ฅํ๊ณ ์ฌ๊ธฐ์ A๊ฐ INSERT ๋ด์ฉ์ ๋กค๋ฐฑํด๋ฒ๋ ค๋ B๋ ๋ฌ๋ผ์ง ๋ด์ฉ์ด ์ด๋ค ๊ฒ์ธ์ง ์์ง ๋ชปํ ์ํ๋ก ์์ ํ๊ฒ ๋ฉ๋๋ค.
์ด์ฒ๋ผ ์ด๋ ํ ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ ์์ ์ด ์๋ฃ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณผ ์ ์๊ฒ ๋๋ ํ์์ ๋ํฐ ๋ฆฌ๋(Dirty Read)๋ผ ํ๊ณ , ๋ํฐ ๋ฆฌ๋๊ฐ ํ์ฉ๋๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด READ UNCOMMITTED ์ ๋๋ค. ๋ํฐ ๋ฆฌ๋ ํ์์ ๋ฐ์ดํฐ๊ฐ ๋ํ๋ฌ๋ค๊ฐ ์ฌ๋ผ์ก๋ค ํ๋ ํ์์ ์ด๋ํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ฐ์์ ์ฌ์ฉ์๋ฅผ ํผ๋ ์ค๋ฝ๊ฒ ํ ์ ์์ต๋๋ค. ๋ํ ๋ํฐ ๋ฆฌ๋๋ฅผ ์ ๋ฐํ๋ READ UNCOMITTED ๊ฒฉ๋ฆฌ ์์ค์ RDBMS ํ์ค์์ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ์ธ์ ํ์ง ์์ ์ ๋๋ก ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ๋ง์ ๊ฒฉ๋ฆฌ ์์ค์ ๋๋ค. ๋ฐ๋ผ์ MySQL์ ์ฌ์ฉํ๋ค๋ฉด ์ต์ READ COMMITTED ์ด์์ ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์ ์ค๋ผํด DBMS์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ ์จ๋ผ์ธ ์๋น์ค์์ ๊ฐ์ฅ ๋ง์ด ์ ํ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ ๋๋ค. ์ด ๋ ๋ฒจ์์๋ ์ READ UNCOMMITTED ์์ค์์ ๋ฐ์ํ ์ ์๋ ๋ํฐ ๋ฆฌ๋(Dirty Read)์ ๊ฐ์ ํ์์ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด๋ ํ ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋๋ผ๋ COMMIT์ด ์๋ฃ๋ ๋ฐ์ดํฐ๋ง ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์กฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ธ๋ ๋ ์ฝ๋๋ InnoDB์ ์์คํ ํ ์ด๋ธ ์คํ์ด์ค์ ์ธ๋ ์์ญ์ ๊ธฐ๋ก์ด ๋๋๋ฐ, ์ธ๋ ๋ ์ฝ๋๋ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ ๋ณด์ฅํ๊ธฐ ์ํ ์ฉ๋๋ฟ ์๋๋ผ ํธ๋์ญ์ ์ ROLLBACK์ ๋ํ ๋ณต๊ตฌ์๋ ์ฌ์ฉ์ด ๋ฉ๋๋ค.
โ ์ธ๋(Undo) ๋ก๊ทธ โ
์ธ๋ ์์ญ์ UPDATE ๋ฌธ์ฅ์ด๋ DELETE์ ๊ฐ์ ๋ฌธ์ฅ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ ๋ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ(์ด์ ๋ฐ์ดํฐ)๋ฅผ ๋ณด๊ดํ๋ ๊ณณ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.MySQL > UPDATE member SET name = '์ด์ฃผํ' WHERE member_id = '5';
์ ๋ฌธ์ฅ์ด ์คํ๋๋ฉด ํธ๋์ญ์ ์ ์ปค๋ฐํ์ง ์์๋ ์ค์ ๋ฐ์ดํฐ ํ์ผ ๋ด์ฉ์ "์ด์ฃผํ"์ผ๋ก ๋ณ๊ฒฝ์ด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๊ฐ์ด "ํ๊ธธ๋"์ด๋ผ๋ฉด ์ธ๋ ์์ญ์๋ "ํ๊ธธ๋"์ด๋ผ๋ ๊ฐ์ด ๋ฐฑ์ ์ด ๋๋ ๊ฒ์ ๋๋ค. ์ด ์ํ์์ ๋ง์ฝ ์ฌ์ฉ์๊ฐ ์ปค๋ฐํ๊ฒ ๋๋ฉด ํ์ฌ ์ํ(์ด์ฃผํ)๊ฐ ๊ทธ๋๋ก ์ ์ง๋๊ณ , ๋กค๋ฐฑํ๊ฒ ๋๋ค๋ฉด ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ(ํ๊ธธ๋)๋ฅผ ๋ค์ ๋ฐ์ดํฐ ํ์ผ๋ก ๋ณต๊ตฌํฉ๋๋ค.
์ด๋ฌํ ์ธ๋์ ๋ฐ์ดํฐ๋ ํฌ๊ฒ ๋ ๊ฐ์ง ์ฉ๋๋ก ์ฌ์ฉ์ด ๋ฉ๋๋ค.
1) ํธ๋์ญ์ ์ ๋กค๋ฐฑ ๋๋น์ฉ
2) ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ ์งํ๋ฉด์ ๋์ ๋์์ฑ์ ์ ๊ณต
์ฌ์ฉ์ B๊ฐ ํธ๋์ญ์ ์ ์์ํ๊ณ 'Choi OO'์ ์กฐํํ๋ฉด ์ผ์นํ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์๋๋ค.
ํ์ง๋ง ์ดํ์ ์ฌ์ฉ์ A๊ฐ 2001์ NAME์ 'Choi OO'์ผ๋ก ์์ ํ๊ณ ์ปค๋ฐํ ํ ์ฌ์ฉ์ B๊ฐ ๋์ผํ ์ฟผ๋ฆฌ๋ก ์กฐํํ๋ฉด ์ด๋ฒ์๋ ๊ฒฐ๊ณผ๊ฐ 1๊ฑด ์กฐํ๋๋ค. ์ด๋ ๋ณ๋ค๋ฅธ ๋ฌธ์ ๋ ์์ด๋ณด์ด๋ ์ฌ์ฉ์ B๊ฐ ํ๋์ ํธ๋์ญ์ ๋ด์์ ๋์ผํ SELECT ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค๋ "REPEATABLE READ" ์ ํฉ์ฑ์ ์ด๊ธ๋๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ๋ถ์ ํฉ ํ์์ ์ผ๋ฐ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ํฌ๊ฒ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง, ํ๋์ ํธ๋์ญ์ ์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฝ๊ณ ๋ณ๊ฒฝํ๋ ์์ ์ด ๊ธ์ ์ ์ธ ์ฒ๋ฆฌ์ ์ฐ๊ฒฐ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ ๊ธ๊ณผ ์ถ๊ธ ์ฒ๋ฆฌ๊ฐ ๊ณ์ ์งํ๋๊ณ ์์ ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ค๋ ์ ๊ธ๋ ๊ธ์ก์ ์ดํฉ์ ์กฐํํ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. "REPEATABLE READ"๊ฐ ๋ณด์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ดํฉ์ ๊ณ์ฐํ๋ SELECT ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋๋ง๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์ ๋๋ค. ์ค์ํ ๊ฒ์ ์ฌ์ฉ์ค์ธ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ํด ์คํ๋๋ SQL ๋ฌธ์ฅ์ด ์ด๋ ํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋์ง ์ ํํ ์์ธกํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ํด์๋ ๊ฐ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์๊ณ ์์ด์ผํฉ๋๋ค.
REPEATABLE READ๋ MySQL์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ ๋๋ค. ์ด ๊ฒฉ๋ฆฌ ์์ค์์๋ READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์์ ๋ฐ์ํ๋ "NON-REPEATABLE READ" ๋ถ์ ํฉ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํธ๋์ญ์ ์ด ROLLBACK๋ ๊ฐ๋ฅ์ฑ์ ๋๋นํด ๋ณ๊ฒฝ๋ ์ ๋ ์ฝ๋๋ฅผ ์ธ๋(Undo) ์์ญ์ ๋ฐฑ์ ํด๋๊ณ ์ค์ ๋ ์ฝ๋ ๊ฐ์ ๋ณ๊ฒฝํฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ๋ฐฉ์์ MVCC(Multi Version Concurrency Control)์ด๋ผ๊ณ ํ๋ค.
REPEATABLE READ๋ ์ด MVCC๋ฅผ ์ํด ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋์ผํ ํธ๋์ญ์ ๋ด์์๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค ๋ํ MVCC๋ฅผ ์ด์ฉํด COMMIT๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ REPEATABLE READ์ READ COMMITTED์ ์ฐจ์ด๋ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์ ์ฌ๋ฌ ๋ฒ์ ๊ฐ์ด๋ฐ ๋ช ๋ฒ์งธ ์ด์ ์ ๋ฒ์ ๊น์ง ์ฐพ์ ๋ค์ด๊ฐ์ผ ํ๋์ง์ ์์ต๋๋ค.
MVCC(Multi Version Concurrency Control) - ์ ๊ธ์ ์ฌ์ฉํ์ง ์๋ ์ผ๊ด๋ ์ฝ๊ธฐ๋ฅผ ์ ๊ณต
MVCC๋ ๋ค์ค ๋ฒ์ ๋ณํ์ํ ์ ์ด์ ์ฝ์๋ก DBMS์์๋ ์ฐ๊ธฐ(Write) ์ธ์ ์ด ์ฝ๊ธฐ(Read) ์ธ์ ์ ๋ธ๋กํนํ์ง ์๊ณ , ์ฝ๊ธฐ ์ธ์ ์ด ์ฐ๊ธฐ ์ธ์ ์ ๋ธ๋กํนํ์ง ์๊ฒ ์๋ก ๋ค๋ฅธ ์ธ์ ์ด ๋์ผํ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ ๋ ๊ฐ ์ธ์ ๋ง๋ค ์ค๋ ์ท ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฅํด์ฃผ๋ ๋ฉ์ปค๋์ฆ
์ด๋ RDBMS์์ ๋์์ฑ์ ๋์ด๊ธฐ ์ํด ๋ฑ์ฅํ ๊ธฐ์ ๋ก, ์์์ ์ ์ฐ์ค ์ด์์๋ค์ด ์๋ฒ ์ปดํจํฐ๋ฅผ ์ฌ์ฉํ๋ ์์ ์๋ MVCC๊ฐ ์ ํ์ฌํญ์ด์์ง๋ง ์ธํฐ๋ท์ด ๋ณดํธํ๋๊ณ ์จ๋ผ์ธ์ผ๋ก ์ ๋ฌด๋ฅผ ์ฒ๋ฆฌํ๋ ์๋์์๋ DBMS๋ฅผ ์ ํํ๋๋ฐ ์์ด MVCC๊ฐ ๊ฐ์ฅ ์ค์ํ ์์๊ฐ ๋๋ค.์ถ์ฒ : ๋ฐ์ดํฐ๋ท(http://www.datanet.co.kr)
๋ชจ๋ InnoDB์ ํธ๋์ญ์ ์ ๊ณ ์ ํ ํธ๋์ญ์ ๋ฒํธ(์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ฐ)๋ฅผ ๊ฐ์ง๋ฉฐ, ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ชจ๋ ๋ ์ฝ๋์๋ ๋ณ๊ฒฝ์ ๋ฐ์์ํจ ํธ๋์ญ์ ์ ๋ฒํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด ๋ถํ์ํ๋ค๊ณ ํ๋จํ๋ ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ํฉ๋๋ค.
REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ MVCC๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์คํ์ค์ธ ํธ๋์ญ์
๊ฐ์ด๋ฐ ๊ฐ์ฅ ์ค๋๋ ํธ๋์ญ์
๋ฒํธ๋ณด๋ค ํธ๋์ญ์
๋ฒํธ๊ฐ ์์ ์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค.
์ ๊ทธ๋ฆผ์์๋ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๊ฐ ํ๋๋ง ์๋๊ฒ์ผ๋ก ํํํ์ง๋ง, ์ค์ ๋ก๋ ํ๋์ ๋ ์ฝ๋์ ๋ํด ๋ฐฑ์ ์ด ํ๋ ์ด์ ์ผ๋ง๋ ์ง ์กด์ฌํ ์ ์์ต๋๋ค. ๋ง์ฝ ํ ์ฌ์ฉ์๊ฐ BEGIN ๋ช ๋ น์ผ๋ก ํธ๋์ญ์ ์ ์์ํ ํ ์ฅ์๊ฐ๋์ ํธ๋์ญ์ ์ ์ข ๋ฃํ์ง ์์ผ๋ฉด ์ธ๋ ์์ญ์ด ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ก ๋ฌดํ์ ์ปค์ง ์ ์๊ณ , ์ด๋ ๊ฒ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋๊ฐ ๋ง์์ง์๋ก MySQL ์๋ฒ์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
REPEATABLE ๊ฒฉ๋ฆฌ ์์ค์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ถ์ ํฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์ ์ฌ์ฉ์ A๊ฐ employees ํ ์ด๋ธ์ INSERT๋ฅผ ์คํํ๋ ๋์ค์ ์ฌ์ฉ์ B๊ฐ SELECT .. FOR UPDATE ์ฟผ๋ฆฌ๋ก employees ํ ์ด๋ธ์ ์กฐํํ์ ๋์ ๊ฒฐ๊ณผ์ ๋๋ค.
์ ๊ทธ๋ฆผ์์ ์ฌ์ฉ์ B๋ ํธ๋์ญ์ ์์ ํ SELECT ์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด์ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์์ ์ค๋ช ์ฒ๋ผ ๋์ผํ ํธ๋์ญ์ ๋ด์์๋ ๊ฒฐ๊ณผ๊ฐ ๋์ผํด์ผ ํฉ๋๋ค.
ํ์ง๋ง ์ ๊ทธ๋ฆผ์์ ์ฌ์ฉ์ B๊ฐ ์คํํ๋ ๋ ๋ฒ์ SELECT .. FOR UPDATE ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ ์๋ก ๋ค๋ฆ ๋๋ค. ์ด๋ ๊ฒ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ํํ ๋ณ๊ฒฝ ์์ ์ ์ํด ๋ ์ฝ๋๊ฐ ๋ณด์๋ค๊ฐ ์๋ณด์๋ค๊ฐ ํ๋ ํ์์ PHANTOM READ(PHANTOM ROW)๋ผ๊ณ ํฉ๋๋ค.
SELECT .. FOR UPDATE ์ฟผ๋ฆฌ๋ SELECTํ๋ ๋ ์ฝ๋์ ์ฐ๊ธฐ ์ ๊ธ์ ๊ฑธ์ด์ผ ํ๋๋ฐ, ์ธ๋ ๋ ์ฝ๋์๋ ์ ๊ธ์ ๊ฑธ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ ์ธ๋ ์์ญ์ ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ ํ์ฌ ๋ ์ฝ๋์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.
๊ฐ์ฅ ๋จ์ํ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฉด์ ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ ๋๋ค. ๋ํ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ๋ ๋ค๋ฅธ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค๋ณด๋ค ํ์ ํ ๋จ์ด์ง๋๋ค.
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ด SERIALIZABLE๋ก ์ค์ ๋๋ฉด ์ฝ๊ธฐ ์์ ๋ ๊ณต์ ์ ๊ธ(์ฝ๊ธฐ ์ ๊ธ)์ ํ๋ํด์ผ ํ๋ฉฐ, ๋์์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ฆ, ํ ํธ๋์ญ์ ์์ ์ฝ๊ณ ์ฐ๋ ๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ์ ๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
SERIALIZABLE ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ผ๋ฐ์ ์ธ DBMS์์ ๋ฐ์ํ๋ "PHANTOM READ" ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ง๋ง, ์์์ ์ค๋ช ๋๋ ธ๋ฏ์ด InnoDB ์คํ ๋ฆฌ์ง ์์ง์์๋ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ "PHANTOM READ"๊ฐ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด SERIALIZABLE ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ ํ์์ฑ์ ์์ด๋ณด์ ๋๋ค.