MySQL์ ๊ฒฉ๋ฆฌ ์์ค
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation Level)์ด๋ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์ฒ๋ฆฌ๋ ๋ ํน์ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ฒ ํ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
๊ฒฉ๋ฆฌ ์์ค์ ํฌ๊ฒ 4๊ฐ์ง๋ก ๋๋๋ค.
- Read UNCOMMITTED
- Read COMMITTED
- REPEATABLE READ
- SERIALIZABLE
1๋ฒ๋ถํฐ 4๋ฒ๊น์ง ๋ค๋ก ๊ฐ์๋ก ๊ฐ ํธ๋์ญ์
๊ฐ์ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ(๊ณ ๋ฆฝ) ์ ๋๊ฐ ๋์์ง๋ฉฐ, ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ๋ ์ผ๋ฐ์ ์ผ๋ก ๋จ์ด์ง ์ ์๋ค.
๊ฒฉ๋ฆฌ ์์ค์ด ๋์์ง์๋ก MySQL ์๋ฒ์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋ง์ด ๋จ์ด์ง ๊ฒ์ผ๋ก ์๊ฐํ ์ ์์ง๋ง, ์ฌ์ค SERIALIZABLE ์์ค์ด ์๋๋ผ๋ฉด ํฌ๊ฒ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ์ง๋ ์์ผ๋ ์์ฌํด๋ ๋๋ค.
ํ๋ ํน๋ณํ ๋ถ๋ถ์ด ์๋ค. SQL-92 or 99 ํ์ค์ ๋ฐ๋ฅด๋ฉด REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ ์ ์๋ค.
ํ์ง๋ง, InnoDB๋ ๋
ํนํ ํน์ฑ ๋๋ฌธ์ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
์ผ๋ฐ์ ์ธ ์จ๋ผ์ธ ์๋น์ค ์ฉ๋์ DB์์๋ READ COMMITTED์ REPETABLE READ ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ค.
ORACLE๊ณผ ๊ฐ์ DBMS๋ READ COMMITTED ์์ค์ ๋ง์ด ์ฌ์ฉํ๊ณ , MySQL์์๋ REPEATABLE READ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
1. READ UNCOMMITTED
๊ฐ ํธ๋์ญ์ ์์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด COMMIT์ด๋ ROLLBACK ์ฌ๋ถ์ ์๊ด์์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณด์ธ๋ค.
์ฌ์ฉ์ A๊ฐ INSERT๋ฅผ ์ํํ ํ COMMIT ํ๊ธฐ๋ ์ ์ ์ฌ์ฉ์ B๊ฐ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ๋ง์ง ์๋๋ค.
์ด ์ํฉ์์ ์ฌ์ฉ์ A๊ฐ ์ฒ๋ฆฌ ๋์ค ์ด๋ ํ ๋ฌธ์ ๋ก ์ธํด ROLLBACK์ ์งํํ๋ค๋ฉด ์ฌ์ ํ ์ฌ์ฉ์ B๋ ์กด์ฌํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์
์ ์งํํ ๊ฒ์ด๋ผ๋ ๊ฒ์ด๋ค.
๋ฌธ์ ์
์ด์ฒ๋ผ ์ด๋ค ํธ๋์ญ์
์์ ์ฒ๋ฆฌํ ์์
์ด ์๋ฃ๋์ง ์์์์๋ ๋ค๋ฅธ ํธ๋์ญ์
์์ ๋ณผ ์ ์๋ ํ์์ Dirty Read๋ผ๊ณ ํ๋ค.
์ด๋ฌํ ๋ฌธ์ ๋๋ฌธ์ READ UNCOMMITTED๋ RDBMS ํ์ค์์๋ ํธ๋์ญ์
์ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ์ธ์ ํ์ง ์์ ์ ๋๋ก ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ๋ง๋ค.
MySQL์ ์ฌ์ฉํ๋ค๋ฉด ์ต์ํ READ COMMITTED ์ด์์ ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ ๊ฒ!
2. READ COMMITTED
Oracle DBMS์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฉฐ, ์จ๋ผ์ธ ์๋น์ค์์ ๊ฐ์ฅ ๋ง์ด ์ ํ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
ํด๋น ๊ฒฉ๋ฆฌ ์์ค๋ถํฐ๋ Dirty Read์ ๊ฐ์ ํ์์ด ๋ฐ์ํ์ง ์๋๋ค.
์ด๋ ํ ํธ๋์ญ์
์ด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋๋ผ๋ COMMIT์ด ์๋ฃ๋ ๋ฐ์ดํฐ๋ง ๋ค๋ฅธ ํธ๋์ญ์
์์ ์กฐํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ธ๋ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด ์ธ๋ ๋ก๊ทธ ์์ญ์ ์ด์ ๋ ์ฝ๋ ์ ๋ณด๊ฐ ๋ฐฑ์
๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์ A๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์์ง COMMIT์ด ๋๊ธฐ ์ ์ด๋ผ๋ฉด ์ฌ์ฉ์ B๋ ํ
์ด๋ธ์ ์กฐํํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๋ ์์ญ์ ๋ฐฑ์
๋ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
๋ฌธ์ ์
READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์์๋ NON-REPEATABLE READ๋ผ๋ ๋ ์ฝ๋๊ฐ ๋ฐ๋ณต๋์ด ์ฝ์ด์ง ๋ ๋ฐ์ํ๋ ๋ฐ์ดํฐ ๋ถ์ ํฉ ๋ฌธ์ ๊ฐ ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํ๋์ ํธ๋์ญ์ ๋ด์์ ๋๊ฐ์ SELECT ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค๋ REPEATABLE READ ์ ํฉ์ฑ์ ๋ฐ๋ฅผ ์ ์์ด์ผ ํ๋ค.
ํ์ง๋ง, ํด๋น ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ฌ์ฉ์ B๊ฐ ๋จผ์ ํธ๋์ญ์ ์ ์์ํ๊ณ ์ฒ์ ํน์ ์กฐ๊ฑด์ผ๋ก ๋ ์ฝ๋๋ฅผ ๊ฒ์ํ์ ๋๋ ๊ฒฐ๊ณผ๊ฐ ์์์ง๋ง ๊ทธ ์ฌ์ด์ ์ฌ์ฉ์ A๊ฐ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ COMMIT ํ์๊ณ , ๋ค์ ์ฌ์ฉ์ B๊ฐ ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ๋ ์ฝ๋๋ฅผ ๊ฒ์ํ๋ฉด ๋ฐ์ดํฐ๊ฐ 1๊ฐ ๊ฒ์๋๋ ๋ฌธ์ ์ธ ๊ฒ์ด๋ค. ์ด๋ REPEATABLE READ ์ ํฉ์ฑ์ ์ด๊ธ๋๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ๋ถ์ ํฉ ํ์์ ์ผ๋ฐ์ ์ธ ์ํฉ์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ ์ ์์ง๋ง ํ๋์ ํธ๋์ญ์ ์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฝ๊ณ ๋ณ๊ฒฝํ๋ ์์ ์ด ๊ธ์ ์ ์ผ๋ก ๊ด๋ จ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
3. REPETABLE READ
ํด๋น ๊ฒฉ๋ฆฌ ์์ค์ MySQL์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ค. ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ๊ฐ์ง MySQL ์๋ฒ์์๋ ์ต์ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค ์ด์์ ์ฌ์ฉํด์ผ ํ๋ค.
ํธ๋์ญ์
๋ด๋ถ์์ ์คํ๋๋ SELECT์ ์ธ๋ถ์์ ์คํ๋๋ SELECT์ ์ฐจ์ด๊ฐ ์๋ READ-COMMITTED ๊ฒฉ๋ฆฌ ์์ค๊ณผ๋ ๋ค๋ฅด๊ฒ,
REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์ ๊ธฐ๋ณธ์ ์ผ๋ก SELECT ์ฟผ๋ฆฌ ๋ฌธ์ฅ๋ ํธ๋์ญ์
๋ฒ์ ๋ด์์๋ง ๋์ํ๋ค.
ํด๋น ๊ฒฉ๋ฆฌ ์์ค ๋ถํฐ๋ NON-REPEATABLE READ ํ์์ด ๋ฐ์ํ์ง ์๋๋ค. InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํธ๋์ญ์
์ด ROLLBACK ๋ ๊ฐ๋ฅ์ฑ์ ๋๋นํด ๋ณ๊ฒฝ๋๊ธฐ ์ ๋ ์ฝ๋๋ฅผ ์ธ๋ ๊ณต๊ฐ์ ๋ฐฑ์
ํด ๋๊ณ ์ค์ ๋ ์ฝ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ค.
์ด๋ฌํ ๋ณ๊ฒฝ ๋ฐฉ์์ MVCC(Multi Version Concurrency Control) ์ด๋ผ๊ณ ํ๋ค.
REPEATABLE READ๋ MVCC๋ฅผ ์ํด ์ธ๋ ์์ญ์ ๋ฐฑ์
๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ๋์ผ ํธ๋์ญ์
๋ด์์๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค ์ ์๊ฒ ๋ณด์ฅํ๋ค.
READ_COMMITTED ๊ฒฉ๋ฆฌ ์์ค ๋ํ MVCC๋ฅผ ์ด์ฉํด COMMIT ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ๋ ํ๋ค. ํ์ง๋ง, ์ฐจ์ด๋ ์ธ๋ ์์ญ์ ๋ฐฑ์
๋ ๋ ์ฝ๋์ ์ฌ๋ฌ ๋ฒ์ ๊ฐ์ด๋ฐ ๋ช ๋ฒ์งธ ์ด์ ๋ฒ์ ๊น์ง ์ฐพ์ ๋ค์ด๊ฐ์ผ ํ๋๋์ ์๋ค.
๋ชจ๋ InnoDB์ ํธ๋์ญ์ ์ ๊ณ ์ ํ ํธ๋์ญ์ ๋ฒํธ(์์ฐจ ์ฆ๊ฐ)๋ฅผ ๊ฐ์ง๋ค. ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ชจ๋ ๋ ์ฝ๋์๋ ๋ณ๊ฒฝ์ ๋ฐ์์ํจ ํธ๋์ญ์ ์ ๋ฒํธ๊ฐ ํฌํจ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด ๋ถํ์ํ๋ค๊ณ ํ๋จ๋๋ ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ํ๋ค.
์คํ ์ค์ธ ํธ๋์ญ์ ์ค์ ๊ฐ์ฅ ์ค๋๋ ํธ๋์ญ์ ๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ณด๋ค ์์ ํธ๋์ญ์ ๋ฒํธ๋ฅผ ๊ฐ์ง ์ธ๋ ์์ญ์ ํน์ ๊ตฌ๊ฐ ๋ฐ์ดํฐ๋ ์ญ์ ํ ์ ์๊ณ ๋ณด์กดํด์ผ ํ๋ค.
์ ๊ทธ๋ฆผ ์์์์ ์ฌ์ฉ์ A์ ํธ๋์ญ์ ๋ฒํธ๋ 12์ด๊ณ , ์ฌ์ฉ์ B๋ 10์ด๋ค. ์ด๋ ์ฌ์ฉ์ A๊ฐ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ค๊ณ ํ๋๋ผ๋ ์ฌ์ฉ์ B๋ ์์ ๋ณด๋ค ์์ ํธ๋์ญ์ ๋ฒํธ ์ฆ, 10๋ณด๋ค ์์ ํธ๋์ญ์ ๋ฒํธ๋ฅผ ๊ฐ์ง ๋ณ๊ฒฝ์ฌํญ๋ง์ ๋ณด๊ฒ ๋๋ค.
๋ฌธ์ ์
REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ PHANTOM READ ๋ถ์ ํฉ ํ์์ด ๋ฐ์ํ ์ ์๋ค.
REPEATABLE READ์์๋ ํ๋์ ํธ๋์ญ์
์์ ๋ ๋ฒ์ SELECT ์ฟผ๋ฆฌ์ ๋ํ ๊ฒฐ๊ณผ๋ ๋๊ฐ์์ผ ํ๋ค๊ณ ํ๋ค.
ํ์ง๋ง SELECT ... FOR UPDATE ์ฟผ๋ฆฌ๋ SELECT ... LOCK IN SHARE MODE๋ก ์กฐํ๋๋ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅผ ์ ์๋ค.
SELECT FOR UPDATE ์ฟผ๋ฆฌ?
๊ฐ์ฅ ๋จผ์ LOCK์ ํ๋ํ ์ธ์ ์ ๊ฒ์๋ ๋ ์ฝ๋๋ค์ด UPDATE ์ฟผ๋ฆฌ ํ COMMIT ๋๊ธฐ ์ด์ ๊น์ง ๋ค๋ฅธ ์ธ์ ๋ค์ ํด๋น ๋ ์ฝ๋๋ค์ ์์ ํ์ง ๋ชปํ๋๋ก ํ๋ ๊ธฐ๋ฅ
๊ทธ ์ด์ ๋ SELECT ... FOR UPDATE ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ SELECT ํ๋ ๋ ์ฝ๋์ ์ฐ๊ธฐ ์ ๊ธ์ ๊ฑธ์ด์ผ ํ๋๋ฐ, ์ธ๋ ๋ ์ฝ๋์๋ ์ ๊ธ์ ๊ฑธ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์, ์ธ๋ ์์ญ์ ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋ ํ์ฌ ๋ ์ฝ๋์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ ํ์์ด ๋ฐ์ํ๋ค.
์ด๋ ๊ฒ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ํํ ๋ณ๊ฒฝ ์์ ์ ์ํด ๋ ์ฝ๋๊ฐ ๋ณด์๋ค ์ ๋ณด์๋ค ํ๋ ํ์์ PHANTOM READ๋ผ๊ณ ํ๋ค.
โ InnoDB ์คํ ๋ฆฌ์ง ์์ง์์๋ SELECT FOR UPDATE ๋๋ SELECT FOR SHARE ๋ฑ ์ ๊ธ์ ๋๋ฐํ SELECT ์ฟผ๋ฆฌ์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ ์ ์์ง๋ง, ์ด๊ฒ์ ์์ธ์ ์ธ ์ํฉ์ด๋ค. ์ผ๋ฐ์ ์ธ ์ํฉ์์๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ ๊ฐญ ๋ฝ๊ณผ ๋ฅ์คํธ ํค ๋ฝ ๋๋ถ์ PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๊ณ ํ๋ค.
4. SERIALIZABLE
ํด๋น ๊ฒฉ๋ฆฌ ์์ค์ ๊ฐ์ฅ ๋จ์ํ๋ฉด์ ๋์์ ๊ฐ์ฅ ์๊ฒฉํ๋ค. ๊ทธ๋งํผ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค๋ณด๋ค ๋ง์ด ๋จ์ด์ง๋ค.
InnoDB ํ
์ด๋ธ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ํ SELECT ์์
์ ์๋ฌด๋ฐ ๋ ์ฝ๋ ์ ๊ธ๋ ์์ด ์คํ๋๋ค.
ํ์ง๋ง ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค์ด SERIALIZABLE๋ก ์ค์ ๋๋ฉด ์ฝ๊ธฐ ์์
๋ ๊ณต์ ์ ๊ธ(์ฝ๊ธฐ ์ ๊ธ)์ ํ๋ํด์ผ๋ง ํ๋ฉฐ, ๋์์ ๋ค๋ฅธ ํธ๋์ญ์
์ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํ๊ฒ ๋๋ค.
ํ ํธ๋์ญ์ ์์ ์ฝ๊ณ ์ฐ๋ ๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ์ ๋ ์ ๊ทผํ ์ ์๋ ๊ฒ์ด๋ค.
SERIALIZABLE ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ผ๋ฐ์ ์ธ DBMS์์ ์ผ์ด๋๋ PHANTOM READ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
ํ์ง๋ง InnoDB์์๋ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก ๊ตณ์ด SERIALIZABLE์ ์ฌ์ฉํ ํ์์ฑ์ ์๋ค
'๐ข๏ธDatabase' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB ์ ํ๋์ ์นด๋๋๋ฆฌํฐ (+์ตํฐ๋ง์ด์ ํต๊ณ ์ ๋ณด) (0) | 2025.01.09 |
---|---|
XA Datasource์ 2 Phase Commit(2PC)ย ์ ๋ํด์ (0) | 2024.05.08 |
[Real MySQL 8.0] ์ฟผ๋ฆฌ ์์ฑ ๋ฐ ์ต์ ํ - JOIN (0) | 2023.08.22 |
Redis ์๊ณ ์ฌ์ฉํ์! (0) | 2023.08.20 |
[Real MySQL 8.0] ์ฟผ๋ฆฌ ์์ฑ ๋ฐ ์ต์ ํ - SELECT (0) | 2023.08.14 |