๐ 1. ๊ฒฉ๋ฆฌ ์์ค์ด๋
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation Level)์ด๋ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์ฒ๋ฆฌ๋ ๋ ํน์ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ฒ ํ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋งํ๋ค.
๊ฒฉ๋ฆฌ ์์ค์ ํฌ๊ฒ 'READ UNCOMMITTED', 'READ COMMITTED', 'REPEATABLE READ', 'SERIALIZABLE'์ 4๊ฐ์ง๋ก ๋๋๋ค. ๋ค๋ก ๊ฐ์๋ก ๊ฐ ํธ๋์ญ์
๊ฐ์ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ(๊ณ ๋ฆฝ) ์ ๋๊ฐ ๋์์ง๋ฉฐ, ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ๋ ๋จ์ด์ง๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
'DIRTY READ'๋ผ๊ณ ๋ ํ๋ 'READ UNCOMMITTED"๋ ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๊ณ , 'SERIALIZABLE' ๋ํ ๋์์ฑ์ด ์ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๋๋ค.
์ค๋ผํด ๊ฐ์ DBMS์์๋ ์ฃผ๋ก 'READ COMMITTED' ์์ค์ ๋ง์ด ์ฌ์ฉํ๋ฉฐ, MySQL์์๋ 'REPEATABLE READ'๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
๐ 2. ๋ถ์ ํฉ์ ๋ฌธ์
๋ฐ์ดํฐ๋ฒ ์ด์์ ๊ฒฉ๋ฆฌ ์์ค์ ์ด์ผ๊ธฐํ๋ฉด ํญ์ ํจ๊ป ์ธ๊ธ๋๋ ์ธ ๊ฐ์ง ๋ถ์ ํฉ์ ๋ฌธ์ ์ ์ด ์๋ค. ์ธ ๊ฐ์ง ๋ถ์ ํฉ์ ๋ฌธ์ ๋ ๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ๋ผ ๋ฐ์ํ ์๋ ์๊ณ ๋ฐ์ํ์ง ์์ ์๋ ์๋ค.
DIRTY READ | NON-REPEATABLE READ | PHANTOM READ | |
READ UNCOMMITTED | O | O | O |
READ COMMITTED | X | O | O |
REPEATABLE READ | X | X | O (InnoDB๋ ์์) |
SERIALIZABLE | X | X | X |
- DIRTY READ
ํ ํธ๋์ญ์ ์ด ์คํ ์ค์ผ ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํด ์์ ๋์์ง๋ง ์์ง '์ปค๋ฐ๋์ง ์์' ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ ๋ ๋ฐ์ํ๋ค. - NON-REPEATABLE READ
ํ ํธ๋์ญ์ ๋ด์ ๊ฐ์ ํ์ ๋ ๋ฒ ์ด์ ์กฐํ๊ฐ ๋ฐ์ํ๋๋ฐ, ๊ทธ ๊ฐ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. - PHANTOM READ
ํธ๋์ญ์ ์์ ์ํํ ๋ณ๊ฒฝ ์์ ์ ์ํด ๋ ์ฝ๋๊ฐ ๋ณด์๋ค๊ฐ ์ ๋ณด์๋ค๊ฐ ํ๋ ํ์์ ๋งํ๋ค.
4๊ฐ์ ๊ฒฉ๋ฆฌ ์์ค๊ณผ ๊ฒฉ๋ฆฌ ์์ค์ ๋ ๋ฒจ์ ๋ฐ๋ผ ๋ฐ์ํ ์ ์๋ ๋ถ์ ํฉ์ ๋ฌธ์ ์ ์ ์์ธํ ์์๋ณด๋๋ก ํ์.
๐ 3. READ UNCOMMITTED
READ UNCOMMITTED๋ ๊ฐ์ฅ ๋ฎ์ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก, ๊ฐ ํธ๋์ญ์ ์์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด COMMIT์ด๋ ROLLBACK์ ์ฌ๋ถ์ ์๊ด์์ด ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋ณด์ด๊ฒ ๋๋ค.
๊ทธ๋ฆผ์์ ํ์ธํ ์ ์๋ฏ์ด ์์ง ์ปค๋ฐ๋์ง ์์ 'emp_no=500000, first_name=Lara'์ธ ์ฌ์์ ์ฌ์ฉ์ B๊ฐ ์กฐํํ ์ ์๋ค. ๋ฌธ์ ๋ ์ฌ์ฉ์ A๊ฐ ์ฒ๋ฆฌ ๋์ค ์ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํด INSERT ๋ ๋ด์ฉ์ ๋กค๋ฐฑํ๋ค๊ณ ํ๋๋ผ๋ ์ฌ์ ํ ์ฌ์ฉ์ B๋ 'Lara'๊ฐ ์ ์์ ์ธ ์ฌ ์๋ฆฌ๋ผ๊ณ ์๊ฐํ๊ณ ๊ณ์ ์ฒ๋ฆฌํ ๊ฒ์ด๋ผ๋ ์ ์ด๋ค.
์ด์ฒ๋ผ ์ด๋ค ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ ์์ ์ด ์๋ฃ๋์ง ์์๋๋ฐ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณผ ์ ์๋ ํ์์ DIRTY READ(๋ํฐ ๋ฆฌ๋)๋ผ๊ณ ํ๋ค.
์ ํฉ์ฑ(์ด๋ค ๋ฐ์ดํฐ๋ค์ด ๊ฐ์ด ์๋ก ์ผ์นํ๋ ์ํ)์ ๋ฌธ์ ๊ฐ ๋ง์ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฏ๋ก, MySQL์ ์ฌ์ฉํ๋ค๋ฉด ์ต์ํ READ COMMITTED ์ด์์ ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํ๋ค.
DRITY READ | NON-REPEATABLE READ | PHANTOM READ | |
READ UNCOMMITTED | O | O | O |
๐ 4. READ COMMITTED
READ COMMITTED๋ ์ค๋ผํด DBMS์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฉฐ, ์จ๋ผ์ธ ์๋น์ค์์ ๊ฐ์ฅ ๋ง์ด ์ ํ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค. ํด๋น ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ปค๋ฐ์ด ์๋ฃ๋ ๋ฐ์ดํฐ์ ๋ํด์๋ง ์กฐํ๋ฅผ ํ์ฉํ๋ค.
'emp_no=500000, first_name=Lara'์ ๋ฐ์ดํฐ๊ฐ 'emp_no=500000, first_name=Toto'๋ก ๋ณ๊ฒฝ์ด ๋์๋ค. ํ์ง๋ง, ์์ง ์ปค๋ฐ์ด ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ B๋ employees ํ ์ด๋ธ์ด ์๋๋ผ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์์ NON-REPEATABLE READ๋ผ๋ ๋ถ์ ํฉ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์ฌ์ฉ์ B๊ฐ ์ฒ์์ 'Toto'๋ฅผ ๊ฒ์ํ์์ ๋๋ ์ผ์นํ๋ ๊ฒฐ๊ณผ๊ฐ ์์๋ค. ํ์ง๋ง, ์ฌ์ฉ์ A๊ฐ 'Lara'๋ผ๋ ์ฌ์์ 'Toto'๋ก ๋ณ๊ฒฝํ๊ณ ์ปค๋ฐ๊น์ง ํ ํ, ๋ค์ ์ฌ์ฉ์ B๊ฐ 'Toto'๋ฅผ ๊ฒ์ํ๋ฉด ์ด๋ฒ์๋ ๊ฒฐ๊ณผ 1๊ฑด์ด ์กฐํ๋๋ค.
์ด๋ ๋ณ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ด์ง๋ง, ์ฌ์ค ์ฌ์ฉ์ B๊ฐ ํ๋์ ํธ๋์ญ์ ๋ด์์ ๋๊ฐ์ SELECT ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค๋ 'REPEATABLE READ' ์ ํฉ์ฑ์ ์ด๊ธ๋๋ ๊ฒ์ด๋ค.
DRITY RED | NON-REPEATABLE READ | PHANTOM READ | |
READ COMMITTED | X | O | O |
'๊ฒฉ๋ฆฌ ์์ค๊ณผ ๋ถ์ ํฉ์ ๋ฌธ์ '๊ฐ ์ ๋ฆฌ๋์ด ์๋ ํ์์ ์ ์ ์๋ฏ์ด REPEATABLE READ์์๋ NON-REPEATABLE READ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก SELECT ์ฟผ๋ฆฌ ๋ฌธ์ฅ์ด ํธ๋์ญ์ ๋ฒ์ ๋ด์์๋ง ์๋ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ START TRANSACTION(๋๋ BEGIN) ๋ช ๋ น์ผ๋ก ํธ๋์ญ์ ์ ์์ํ ์ํ์์ ์จ์ข ์ผ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณตํด์ ์คํํด ๋ด๋ ๋์ผํ ๊ฒฐ๊ณผ๋ง ๋ณด๊ฒ ๋๋ค.
๐ 5. REPEATABLE READ
REPEATABLE READ๋ MySQL์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
REPEATABLE READ์์๋ NON-REPEATABLE READ ๋ถ์ ํฉ์ด ๋ฐ์ํ์ง ์๋๋ค.
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํธ๋์ญ์ ์ด ROLLBACK ๋ ๊ฐ๋ฅ์ฑ์ ๋๋นํด ๋ณ๊ฒฝ๋๊ธฐ ์ ๋ ์ฝ๋๋ฅผ ์ธ๋(Undo) ๊ณต๊ฐ์ ๋ฐฑ์ ํด ๋๊ณ ์ค์ ๋ ์ฝ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ค. (MVCC๋ฐฉ์)
REPEATABLE READ๋ MVCC(Multi Version Concurrency Control)๋ฅผ ์ํด ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ๋์ผ ํธ๋์ญ์ ๋ด์์๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ NON-REPEATABLE READ ๋ถ์ ํฉ์ด ๋ฐ์ํ์ง ์๋๋ค.
์ฌ์ค์ READ COMMITTED๋ MVCC๋ฅผ ์ด์ฉํด COMMIT ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค๋ค. ํ์ง๋ง, READ COMMITTED์ REPEATABLE READ๋ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์ ์ฌ๋ฌ ๋ฒ์ ๊ฐ์ด๋ฐ ๋ช ๋ฒ์งธ ์ด์ ๋ฒ์ ๊น์ง ์ฐพ์ ๋ค์ด๊ฐ๋๋๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, NON-REPEATABLE READ ๋ฌธ์ ์ ๋ฐ์์ฌ๋ถ๊ฐ ๋ค๋ฅด๊ฒ ๋๋ค.
REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์ ์ด๋ป๊ฒ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์ ์ ๊ทผํ๋์ง ์ดํด๋ณด์.
๋ชจ๋ InnoDB์ ํธ๋์ญ์ ์ ๊ณ ์ ํ ํธ๋์ญ์ ๋ฒํธ(์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ฐ, ํ ์ด๋ธ์์๋ TRX-ID๋ก ํ๊ธฐํ๊ฒ ๋ค.)๋ฅผ ๊ฐ์ง๋ฉฐ, ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ชจ๋ ๋ ์ฝ๋์๋ ๋ณ๊ฒฝ์ ๋ฐ์์ํจ ํธ๋์ญ์ ์ ๋ฒํธ๊ฐ ํฌํจ๋์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ด ๋ถํ์ํ๋ค๊ณ ํ๋จํ๋ ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ญ์ ํ๋ค.
์ฌ์ฉ์ B๊ฐ 'emp_no=500000'์ธ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋, ์์ ์ ํธ๋์ญ์ ๋ฒํธ(10๋ฒ) ๋ณด๋ค ์์ ํธ๋์ญ์ ๋ฒํธ์์ ๋ณ๊ฒฝํ ๊ฒ๋ง ๋ณด๊ฒ ๋๋ค. ๊ทธ๋์ ์ฌ์ฉ์ B๋ ๋ณ๊ฒฝ๋ 'Toto'๋ฅผ ์ป๊ฒ ๋๋ ๊ฒ์ด ์๋๋ผ 'Lara'๋ฅผ ์ป๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ฆ, NON-REPEATABLE READ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
ํ์ง๋ง, REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ PHANTOM READ(๋๋ PHANTOM ROW) ๋ถ์ ํฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ฌ์ฉ์ B๊ฐ ์คํํ๋ ๋ ๋ฒ์ SELECT ... FOR UPDATE ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ ์๋ก ๋ค๋ฅด๋ค. SELECT ... FOR UPDATE ์ฟผ๋ฆฌ๋ SELECT ํ๋ ๋ ์ฝ๋์ ์ฐ๊ธฐ ์ ๊ธ์ ๊ฑธ์ด์ผ ํ๋๋ฐ, ์ธ๋ ๋ ์ฝ๋์๋ ์ ๊ธ์ ๊ฑธ ์ ์๋ค. ๊ทธ๋์ SELECT ... FOR UPDATE๋ SELECT ... LOCK IN SHARE MODE๋ก ์กฐํ๋๋ ๋ ์ฝ๋๋ ์ธ๋ ์์ญ์ ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ ํ์ฌ ๋ ์ฝ๋์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ ๊ฒ์ด๋ค.
DRITY READ | NON-REPEATABLE READ | PHANTOM READ | |
REPEATABLE READ | X | X | X (InnoDB๋ ์์) |
๐ 6. SERIALIZABLE
SERIALIZABLE์ ๊ฐ์ฅ ๋จ์ํ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฉด์ ๋์์ ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค. ๊ทธ๋งํผ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ๋ ๋ค๋ฅธ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค๋ณด๋ค ๋จ์ด์ง๋ค.
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ด SERIALIZABLE๋ก ์ค์ ๋๋ฉด ์ฝ๊ธฐ ์์ ๋ ๊ณต์ ์ ๊ธ(์ฝ๊ธฐ ์ ๊ธ)์ ํ๋ํด์ผ๋ง ํ๋ฉฐ, ๋์์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํ๊ฒ ๋๋ค.
์ฆ, ํ ํธ๋์ญ์ ์์ ์ฝ๊ณ ์ฐ๋ ๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ์ ๋ ์ ๊ทผํ ์ ์๋ ๊ฒ์ด๋ค.
DIRTY READ | NON-REPEATABLE READ | PHANTOM READ | |
SERIALIZABLE | X | X | X |
ํด๋น ๊ธ์
๋ฐฑ์๋น, ์ด์ฑ์ฑ ๋์ 'Real MySQL 8.0',
์ฃผํ์ฒ ๋์ '๋ฉด์ ์ ์ํ CS ์ ๊ณต์ง์ ๋ ธํธ'
๋ฅผ ์ฐธ๊ณ ํ์์ต๋๋ค.
'๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค > ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
B-Tree ์ธ๋ฑ์ค - (1) (0) | 2023.07.03 |
---|---|
MySQL์ ์ ์ฒด ๊ตฌ์กฐ & ์ฟผ๋ฆฌ ์คํ ๊ตฌ์กฐ (0) | 2023.06.18 |
ํธ๋์ญ์ (Transaction) (0) | 2023.06.17 |
[DB] ๋ฐ์ดํฐ๋ฒ ์ด์ค ํค(Key) ๊ฐ๋ & ํค(Key) ์ข ๋ฅ (0) | 2023.06.13 |
์๋ธ์ฟผ๋ฆฌ(Subquery) (0) | 2023.04.18 |