๐ ๊ธ๋ 6๊ธฐ ํฌ์คํ
1. ๋ฏธ์น๋๋ก ๋์ ๋ 7์์ ํ๊ณ
2. ์ฌ์ฉ์๊ฐ ๊ฒ์๋ฌผ์ ์์ฑํ ๋์ ํธ๋์ญ์ ์ฒ๋ฆฌ
3. Spring AOP - (1) ํ๋ก์ ํจํด, ๋ฐ์ฝ๋ ์ดํฐ ํจํด
4. [MySQL] - ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation level)
5. Spring AOP - (2) AOP ๊ฐ๋ ๋ฐ ์ค์ต
6. ์ธํ ๋ฆฌ์ ์ด(IntelliJ) - ๋๋ฒ๊น (Debugging) ํ๊ธฐ
7. [Java, ๋์์ธํจํด] - ์ฑ๊ธํด ํจํด(Singleton Pattern)
8. ์๊ฐ ์ฝ๋๋ฆฌ๋ทฐ Ver_0.1: ์ปค๋ฆฌ์ด ์ฑ์ฅ CODE ์ธ๋ฏธ๋ ์ ๋ฆฌ
9. ํฌ์คํธ๋งจ(API ํ ์คํธ) ํ์ฉํ๊ธฐ
๐ MySQL ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation level)
์๋ ํ์ธ์, ์ด๋ฒ ์๊ฐ์ ์ ๋ฆฌํ ๋ด์ฉ์ MySQL์์ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation level)์ ๊ดํ ๋ด์ฉ์ ๋๋ค.
์ต๊ทผ ๋ช๋ช ๋ฉด์ ์ ์งํํ๋ฉฐ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ์์ค, ๋์์ฑ ๋ฑ๊ณผ ๊ด๋ จ๋ ์ง๋ฌธ์ ๋ฐ์์ ์ด ์์ต๋๋ค.
ํ์ง๋ง ์ด๋ฌํ ๋ถ๋ถ์์๋ ํ์์ ๋ฐ๋ก ๊ณ ๋ฏผ์ ํด๊ฑฐ๋ ๊ณต๋ถํ ์ ์ด ์์๊ธฐ์, ์ด๋ฒ ํฌ์คํ ์ ์์ฑํ๊ฒ ๋์์ต๋๋ค.
โป ํน์๋ ํฌ์คํ ์ ํ๋ฆฐ ๋ด์ฉ์ด ์กด์ฌํ ์ ์์ผ๋ ์ด์ ๋ํด์ ๋ง์ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. :)
ํด๋น ํฌ์คํ ์ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ ํฌ์ปค์ฑ์ ๋์๊ธฐ๋๋ฌธ์ ํธ๋์ญ์ ์ ๊ดํ ์ค๋ช ์ ๊ฐ๋ตํ๊ฒ ํ๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
1) ํธ๋์ญ์ (Transaction)
ํธ๋์ญ์ ์ ๋ฐ์ดํฐ์ ์ ํฉ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ๋๋ค.
ํธ๋์ญ์ ์ ๊ผญ ์ฌ๋ฌ ๊ฐ์ ๋ณ๊ฒฝ ์์ ์ ์ํํ๋ ์ฟผ๋ฆฌ๊ฐ ์กฐํฉ๋์๋๋ง ์๋ฏธ์๋ ๊ฐ๋ ์ ์๋๋๋ค.
ํธ๋์ญ์ ์ ๋ ผ๋ฆฌ์ ์ธ ์์ ์ ์์ฒด๊ฐ 100% ์ ์ฉ๋๊ฑฐ๋(COMMIT) ๋๋ ์๋ฌด๊ฒ๋ ์ ์ฉ๋์ง ์์์ผ ํจ(ROLLBACK)์ ๋ณด์ฅํด์ฃผ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ํธ๋์ญ์ ์ ACID๋ผ ํ๋ ์์์ฑ(Atomicity), ์ผ๊ด์ฑ(Consistency), ๊ฒฉ๋ฆฌ์ฑ(Isolation), ์ง์์ฑ(Durability)์ ๋ณด์ฅํด์ผ ํฉ๋๋ค. ACID์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์์์ฑ(Atomicity): ํธ๋์ญ์ ๋ด์์ ์คํํ ์์ ๋ค์ ๋ง์น ํ๋์ ์์ ์ธ ๊ฒ์ฒ๋ผ ๋ชจ๋ ์ฑ๊ณตํ๊ฑฐ๋ ํน์ ๋ชจ๋ ์คํจํด์ผ ํฉ๋๋ค.
- ์ผ๊ด์ฑ(Consistency): ๋ชจ๋ ํธ๋์ญ์ ์ ์ผ๊ด์ฑ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ๋ฅผ ์ ์งํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ํ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด์ ํญ์ ๋ง์กฑํด์ผ ํฉ๋๋ค.
- ๊ฒฉ๋ฆฌ์ฑ(Isolation): ๋์์ ์คํ๋๋ ํธ๋์ญ์ ๋ค์ด ์๋ก์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๊ฒฉ๋ฆฌํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ง ๋ชปํ๋๋ก ํด์ผ ํฉ๋๋ค. ๊ฒฉ๋ฆฌ์ฑ์ ๋์์ฑ๊ณผ ๊ด๋ จ๋ ์ฑ๋ฅ ์ด์๋ก ์ธํด ๊ฒฉ๋ฆฌ ์์ค์ ์ ํํ ์ ์์ต๋๋ค.
- ์ง์์ฑ(Durability): ํธ๋์ญ์ ์ ์ฑ๊ณต์ ์ผ๋ก ๋๋ด๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํญ์ ๊ธฐ๋ก๋์ด์ผ ํฉ๋๋ค. ์ค๊ฐ์ ์์คํ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๊ทธ ๋ฑ์ ์ฌ์ฉํด์ ์ฑ๊ณตํ ํธ๋์ญ์ ๋ด์ฉ์ ๋ณต๊ตฌํด์ผ ํฉ๋๋ค.
ํธ๋์ญ์ ์ ์์์ฑ, ์ผ๊ด์ฑ, ์ง์์ฑ์ ๋ณด์ฅํ๋๋ฐ ๋ฌธ์ ๋ ๊ฒฉ๋ฆฌ์ฑ์ ๋๋ค. ํธ๋์ญ์ ๊ฐ์ ๊ฒฉ๋ฆฌ์ฑ์ ์๋ฒฝํ ๋ณด์ฅํ๋ ค๋ฉด ๋์์ ์ฒ๋ฆฌ๋๋ ํธ๋์ญ์ ์ ๊ฑฐ์ ์ฐจ๋ก๋๋ก ์คํ์ ํด์ผํฉ๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋งค์ฐ ๋๋น ์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ก ์ธํด ANSI ํ์ค์ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ 4๋จ๊ณ๋ก ๋๋์ด ์ ์ํ๊ณ ์์ต๋๋ค.
2) MySQL์ ๊ฒฉ๋ฆฌ ์์ค
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation level)์ด๋ ๋์์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ์ฒ๋ฆฌ๋ ๋, ํน์ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์กฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๋๋ก ํ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค.
๊ฒฉ๋ฆฌ ์์ค์ ๋ค์๊ณผ ๊ฐ์ด 4๊ฐ์ง๋ก ์ ์ํ ์ ์์ต๋๋ค.
- READ UNCOMMITTED(์ปค๋ฐ๋์ง ์์ ์ฝ๊ธฐ)
- READ COMMITTED(์ปค๋ฐ๋ ์ฝ๊ธฐ)
- REPEATABLE READ(๋ฐ๋ณต ๊ฐ๋ฅํ ์ฝ๊ธฐ)
- SERIALIZABLE(์ง๋ ฌํ ๊ฐ๋ฅ)
์์๋๋ก READ UNCOMMITTED์ ๊ฒฉ๋ฆฌ ์์ค์ด ๊ฐ์ฅ ๋ฎ๊ณ SERIALIZABLE์ ๊ฒฉ๋ฆฌ ์์ค์ด ๊ฐ์ฅ ๋์ต๋๋ค.
๊ฒฉ๋ฆฌ ์์ค์ด ๋์์ง์๋ก MySQL ์๋ฒ์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋ง์ด ๋จ์ด์ง ๊ฒ์ผ๋ก ์๊ฐํ๋ ์ฌ์ฉ์๊ฐ ๋ง์๋ฐ, ์ฌ์ค ๊ทธ๋ ์ง๋ ์์ต๋๋ค.
SERIALIZABLE ๊ฒฉ๋ฆฌ ์์ค์ด ์๋๋ผ๋ฉด ํฌ๊ฒ ์ฑ๋ฅ์ ๊ฐ์ ์ด๋ ์ ํ๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
"DIRTY READ"๋ผ๊ณ ๋ ํ๋ "READ UNCOMMITTED"๋ ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๊ณ , SERIALIZABLE ์ญ์ ๋์์ฑ์ด ์ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์๋ ํ๋ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ๋ผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ ๋๋ค.
๊ฒฉ๋ฆฌ ์์ค | DIRTY READ | NON-REPEATABLE READ | PHANTOM READ |
READ UNCOMMITTED | O | O | O |
READ COMMITTED | O | O | |
REPEATABLE READ | O(InnoDB๋ ๋ฐ์ X) | ||
SERIALIZABLE |
์(READ UNCOMMITTED)์ชฝ์ผ๋ก ๊ฐ ์๋ก ๊ฒฉ๋ฆฌ ์์ค์ด ๋ฎ์์ง๋๋ฐ ๊ฒฉ๋ฆฌ ์์ค์ด ๋ฎ์์๋ก ๋ ๋ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ๋ผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
SQL-92 ๋๋ SQL-99 ํ์ค์ ๋ฐ๋ฅด๋ฉด REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ InnoDB์์๋ ๋
ํนํ ํน์ฑ ๋๋ฌธ์ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ค๋ผํด์ ๊ฒฝ์ฐ ์ฃผ๋ก READ COMMITTED์, MySQL์ ๊ฒฝ์ฐ REPEATABLE READ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
SHOW VARIABLES LIKE 'tx_isolation';
์ผ๋ฐ์ ์ธ ์จ๋ผ์ธ ์๋น์ค ์ฉ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ READ COMMITTED์ REPEATABLE READ ๋ ์ค ํ๋์ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
์๋ ์์ ๋ค์ ๋ชจ๋ AUTO_COMMIT = OFF์ธ ์ํ๋ก ๊ฐ์ ํ๊ณ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
2-1) READ UNCOMMITTED
READ UNCOMMITTED ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฐ ํธ๋์ญ์ ์์์ ๋ณ๊ฒฝ ๋ด์ฉ์ด COMMIT์ด๋ ROLLBACK ์ฌ๋ถ์ ์๊ด ์์ด ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณด์ฌ์ง๊ฒ ๋ฉ๋๋ค.
์ ๊ทธ๋ฆผ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฌ์ฉ์ B๊ฐ ์คํํ๋ SELECT ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ์ด๋ ํ ์ํฅ์ ๋ฏธ์น๋์ง ๋ณด์ฌ์ฃผ๋ ์์์ ๋๋ค.
์ ๊ทธ๋ฆผ์์ ์ฌ์ฉ์ A๋ emp_no = 50000, first_name = 'JuBal'์ธ ์๋ก์ด ์ฌ์์ INSERTํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ B๋ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ์ปค๋ฐํ๊ธฐ๋ ์ ์ emp_no = 50000์ธ ์ฌ์์ ๊ฒ์ํ๊ณ ์์ต๋๋ค. ํ์ง๋ง ์ฌ์ฉ์ B๋ ์ฌ์ฉ์ A๊ฐ INSERTํ ์ฌ์์ ์ ๋ณด๋ฅผ ์ปค๋ฐ๋์ง ์์ ์ํ์์๋ ์กฐํํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ๋ง์ฝ ์ฌ์ฉ์ A๊ฐ ์์ ๋์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ INSERT๋ ๋ด์ฉ์ ๋กค๋ฐฑํด๋ฒ๋ฆฐ๋ค ํ๋๋ผ๋ ์ฌ์ฉ์ B๋ JuBal์ด ์ ์์ ์ธ ์ฌ์์ด๋ผ ํ๋จํ๊ณ ๊ณ์ํด์ ์ฒ๋ฆฌํ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
์ด์ฒ๋ผ ์ด๋ ํ ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ ์์ ์ด ์๋ฃ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณผ ์ ์๊ฒ ๋๋ ํ์์
๋ํฐ ๋ฆฌ๋(Dirty Read)๋ผ ํ๊ณ , ๋ํฐ ๋ฆฌ๋๊ฐ ํ์ฉ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ด READ UNCOMMITTED์ ๋๋ค. ๋ํฐ ๋ฆฌ๋ ํ์์ ๋ฐ์ดํฐ๊ฐ ๋ํ๋ฌ๋ค๊ฐ ์ฌ๋ผ์ก๋ค ํ๋ ํ์์ ์ด๋ํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ฐ์์ ์ฌ์ฉ์๋ฅผ ์๋นํ ํผ๋์ค๋ฝ๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค. ๋ํ ๋ํฐ ๋ฆฌ๋๋ฅผ ์ ๋ฐํ๋ READ UNCOMMITTED ๊ฒฉ๋ฆฌ ์์ค์ RDBMS ํ์ค์์๋ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ์ธ์ ํ์ง ์์ ์ ๋๋ก ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ๋ง์ ๊ฒฉ๋ฆฌ ์์ค์ ๋๋ค. ๋ฐ๋ผ์ MySQL์ ์ฌ์ฉํ๋ค๋ฉด ์ต์ READ COMMITTED ์ด์์ ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
READ UNCOMMITTED ํ ์คํธ
1) ๋จผ์ ๋ ๊ฐ์ Session์ ์ค๋นํ๊ณ ๊ฒฉ๋ฆฌ ์์ค์ ๋ชจ๋ 'READ UNCOMMITTED'๋ก ์์ ํฉ๋๋ค.
// ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค ์กฐํ
show variables like 'tx_isolation';
// ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค ์์
set tx_isolation = 'READ-UNCOMMITTED'
2) ํ๋์ Session์์ ํธ๋์ญ์ ์ ์์(BEGIN)ํ๊ณ INSERT๋ฅผ ์คํํฉ๋๋ค.
3) ๋ค๋ฅธ Session์์ ๋ฐ์ดํฐ๋ฅผ SELECT ํฉ๋๋ค.
4) INSERTํ๋ Session์์ ROLLBACK์ ์ํํฉ๋๋ค.
5) ๋ค๋ฅธ Session์์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ SELECT ํฉ๋๋ค.
์ด์ฒ๋ผ ์ด๋ค ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ ์์ (COMMIT/ROLLBACK)์ด ์๋ฃ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณผ ์ ์๊ฒ ๋๋ ํ์์ ๋ํฐ๋ฆฌ๋(Dirty Read)๋ผ๊ณ ํฉ๋๋ค. ์์์ ๋ง์๋๋ฆฐ ๊ฒ ์ฒ๋ผ ๋ํฐ ๋ฆฌ๋ ํ์์ ๋ฐ์ดํฐ๊ฐ ๋ํ๋ฌ๋ค๊ฐ ์ฌ๋ผ์ก๋ค ํ๋ ํ์์ ์ด๋ํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ฐ์์ ์ฌ์ฉ์๋ฅผ ์๋นํ ํผ๋์ค๋ฝ๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค.
2-2) READ COMMITTED
READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์ ์ค๋ผํด DBMS์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ ์จ๋ผ์ธ ์๋น์ค์์ ๊ฐ์ฅ ๋ง์ด ์ ํ๋๋ ๊ฒฉ๋ฆฌ ์์ค์ ๋๋ค. ์ด ๋ ๋ฒจ์์๋ ์ READ UNCOMMITTED ์์ค์์ ๋ฐ์ํ ์ ์๋ ๋ํฐ ๋ฆฌ๋(Dirty Read)์ ๊ฐ์ ํ์์ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด๋ ํ ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋๋ผ๋ COMMIT์ด ์๋ฃ๋ ๋ฐ์ดํฐ๋ง ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์กฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ๊ทธ๋ฆผ์ ํตํด READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์์ ์ฌ์ฉ์ A๊ฐ ๋ณ๊ฒฝํ ๋ด์ฉ์ด ์ฌ์ฉ์ B์๊ฒ ์ด๋ป๊ฒ ์กฐํ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ A๋ emp_no = 50000์ธ ์ฌ์์ first_name์ "JuBal"์์ "Toto"๋ก ์์ ํ๋๋ฐ, ์ด ๋ ์๋ก์ด ๊ฐ์ธ "Toto"๋ employees ํ ์ด๋ธ์ ์ฆ์ ๊ธฐ๋ก๋๊ณ ์ด์ ๊ฐ์ธ "JuBal"์ Undo ์์ญ์ผ๋ก ๋ฐฑ์ ์ด ๋ฉ๋๋ค. ๋ง์ฝ ์ฌ์ฉ์ A๊ฐ ์ด๋ฌํ ๋ณ๊ฒฝ ๋ด์ญ์ ์ปค๋ฐํ๊ธฐ์ ์ ์ฌ์ฉ์ B๊ฐ emp_no = 50000์ธ ์ฌ์์ ์กฐํํ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ "Toto"๊ฐ ์๋ ์ด์ ๊ฐ์ธ "JuBal"์ด ์กฐํ๊ฐ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ์ B์ SELECT ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ employees ํ ์ด๋ธ์ด ์๋ UNDO ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์์ ๊ฐ์ ธ์จ ๊ฒฐ๊ณผ์ ๋๋ค.
READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ด๋ค ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ ๋ด์ฉ์ด ์ปค๋ฐ๋๊ธฐ ์ ๊น์ง๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๊ทธ๋ฌํ ๋ณ๊ฒฝ ๋ด์ญ์ ์กฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ต์ข ์ ์ผ๋ก ์ฌ์ฉ์ A๊ฐ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ์ปค๋ฐํ๋ฉด ๊ทธ๋๋ถํฐ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ๋ฐฑ์ ๋ UNDO์์ญ์ ๋ฐ์ดํฐ์ธ "JuBal"์ด ์๋ ์๋กญ๊ฒ ๋ณ๊ฒฝ๋ "Toto"๋ผ๋ ๊ฐ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
์ธ๋ ๋ ์ฝ๋๋ InnoDB์ ์์คํ
ํ
์ด๋ธ ์คํ์ด์ค์ ์ธ๋ ์์ญ์ ๊ธฐ๋ก์ด ๋๋๋ฐ, ์ธ๋ ๋ ์ฝ๋๋ ํธ๋์ญ์
์ ๊ฒฉ๋ฆฌ ์์ค์ ๋ณด์ฅํ๊ธฐ ์ํ ์ฉ๋๋ฟ ์๋๋ผ ํธ๋์ญ์
์ ROLLBACK์ ๋ํ ๋ณต๊ตฌ์๋ ์ฌ์ฉ์ด ๋ฉ๋๋ค.
โ
์ธ๋(Undo) ๋ก๊ทธ โ
์ธ๋ ์์ญ์ UPDATE ๋ฌธ์ฅ์ด๋ DELETE์ ๊ฐ์ ๋ฌธ์ฅ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ ๋ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ(์ด์ ๋ฐ์ดํฐ)๋ฅผ ๋ณด๊ดํ๋ ๊ณณ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
MySQL > UPDATE member SET name = '์ด์ฃผํ' WHERE member_id = '5';
์ ๋ฌธ์ฅ์ด ์คํ๋๋ฉด ํธ๋์ญ์ ์ ์ปค๋ฐํ์ง ์์๋ ์ค์ ๋ฐ์ดํฐ ํ์ผ ๋ด์ฉ์ "์ด์ฃผํ"์ผ๋ก ๋ณ๊ฒฝ์ด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๊ฐ์ด "ํ๊ธธ๋"์ด๋ผ๋ฉด ์ธ๋ ์์ญ์๋ "ํ๊ธธ๋"์ด๋ผ๋ ๊ฐ์ด ๋ฐฑ์ ์ด ๋๋ ๊ฒ์ ๋๋ค. ์ด ์ํ์์ ๋ง์ฝ ์ฌ์ฉ์๊ฐ ์ปค๋ฐํ๊ฒ ๋๋ฉด ํ์ฌ ์ํ(์ด์ฃผํ)๊ฐ ๊ทธ๋๋ก ์ ์ง๋๊ณ , ๋กค๋ฐฑํ๊ฒ ๋๋ค๋ฉด ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ(ํ๊ธธ๋)๋ฅผ ๋ค์ ๋ฐ์ดํฐ ํ์ผ๋ก ๋ณต๊ตฌํฉ๋๋ค.
์ด๋ฌํ ์ธ๋์ ๋ฐ์ดํฐ๋ ํฌ๊ฒ ๋ ๊ฐ์ง ์ฉ๋๋ก ์ฌ์ฉ์ด ๋ฉ๋๋ค.
1) ํธ๋์ญ์ ์ ๋กค๋ฐฑ ๋๋น์ฉ
2) ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ ์งํ๋ฉด์ ๋์ ๋์์ฑ์ ์ ๊ณต
READ COMMITTED ํ ์คํธ
1) ๋จผ์ ๋ ๊ฐ์ Session์ ์ค๋นํ๊ณ ๊ฒฉ๋ฆฌ ์์ค์ ๋ชจ๋ 'READ COMMITTED'๋ก ์์ ํฉ๋๋ค.
2) ๊ธฐ์กด์ emp_no = 50000์ธ ์ฌ์์ ์ด๋ฆ์ 'JuBal'์ ๋๋ค.
3) ํ๋์ Session์์ ํธ๋์ญ์ ์ ์์ํ๊ณ ๋ฐ์ดํฐ๋ฅผ Update ํฉ๋๋ค.
4) ๋ค๋ฅธ Session์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
์กฐํํ๋ฉด ๊ธฐ์กด์ ๋ฐ์ดํฐ์ธ 'JuBal'์ด ์กฐํ๊ฐ ๋๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์ SELECT ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ employees ํ ์ด๋ธ์ด ์๋ UNDO ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋์์ ๊ฐ์ ธ์จ ๊ฒฐ๊ณผ์ ๋๋ค.
์์์ ๋ง์๋๋ฆฐ ๋๋ก READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ด๋ค ํธ๋์ญ์ ์์ ๋ณ๊ฒฝํ ๋ด์ฉ์ด ์ปค๋ฐ๋๊ธฐ ์ ๊น์ง๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๊ทธ๋ฌํ ๋ณ๊ฒฝ ๋ด์ญ์ ์กฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
4) UPDATEํ Session์์ COMMITํ ํ ๋ค๋ฅธ Session์์ SELECT ์ํ
์ ๊ฒฐ๊ณผ์ฒ๋ผ COMMIT์ ์งํํ ํ ๋ค๋ฅธ Session์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฉด ์ ์์ ์ผ๋ก ์์ ํ ๋ฐ์ดํฐ๊ฐ ์กฐํ๋ฉ๋๋ค.
"NON-REPEATABLE READ" - READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์
READ COMMITTED ๊ฒฉ๋ฆฌ ์์ค์์๋ "NON-REPEATABLE READ"๋ผ๋ ๋ถ์ ํฉ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค.
์๋ ๊ทธ๋ฆผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ ๊ทธ๋ฆผ์์ ์ฌ์ฉ์ B๊ฐ BEGIN ๋ช ๋ น์ผ๋ก ํธ๋์ญ์ ์ ์์ํ๊ณ first_name = 'Toto'์ธ ์ฌ์์ ์กฐํํ๋ฉด ์ผ์นํ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.
ํ์ง๋ง ์ดํ์ ์ฌ์ฉ์ A๊ฐ emp_no = 50000์ธ ์ฌ์์ ์ด๋ฆ์ 'Toto'๋ก ์์ ํ๊ณ ์ปค๋ฐํ ํ ์ฌ์ฉ์ B๋ ๋์ผํ ์ฟผ๋ฆฌ๋ก ์กฐํํ๋ฉด ์ด๋ฒ์๋ ๊ฒฐ๊ณผ๊ฐ 1๊ฑด์ด ์กฐํ๊ฐ ๋ฉ๋๋ค.
์ด๋ ๋ณ๋ค๋ฅธ ๋ฌธ์ ๋ ์์ด๋ณด์ด๋ ์ฌ์ฉ์ B๊ฐ ํ๋์ ํธ๋์ญ์ ๋ด์์ ๋์ผํ SELECT ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค๋ "REPEATABLE READ" ์ ํฉ์ฑ์ ์ด๊ธ๋๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ๋ถ์ ํฉ ํ์์ ์ผ๋ฐ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ํฌ๊ฒ ๋ฌธ์ ๊ฐ ๋์ง์์ง๋ง, ํ๋์ ํธ๋์ญ์ ์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฝ๊ณ ๋ณ๊ฒฝํ๋ ์์ ์ด ๊ธ์ ์ ์ธ ์ฒ๋ฆฌ์ ์ฐ๊ฒฐ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ ๊ธ๊ณผ ์ถ๊ธ ์ฒ๋ฆฌ๊ฐ ๊ณ์ ์งํ๋๊ณ ์์ ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ค๋ ์ ๊ธ๋ ๊ธ์ก์ ์ดํฉ์ ์กฐํํ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. "REPEATABLE READ"๊ฐ ๋ณด์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ดํฉ์ ๊ณ์ฐํ๋ SELECT ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋๋ง๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์ ๋๋ค. ์ค์ํ ๊ฒ์ ์ฌ์ฉ์ค์ธ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ํด ์คํ๋๋ SQL ๋ฌธ์ฅ์ด ์ด๋ ํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋์ง ์ ํํ ์์ธกํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ํด์๋ ๊ฐ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์๊ณ ์์ด์ผํฉ๋๋ค.
"NON-REPEATABLE READ" - READ COMMITTED ํ ์คํธ
1) ์กฐํ์ ์ฉ Session์์ ํธ๋์ญ์ ์ ์์ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
2) ๋ค๋ฅธ Session์์ ํธ๋์ญ์ ์์ - UPDATE - COMMIT ์์ผ๋ก ์ํํฉ๋๋ค.
3) ์กฐํ์ ์ฉ Session์์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
์ด์ ๊ณผ๋ ๋ฌ๋ฆฌ ์กฐํ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํฉ๋๋ค. ์ด๋ ํ๋์ ํธ๋์ญ์ ๋ด์์ ๋์ผํ SELECT ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค๋ "REPEATABLE READ" ์ ํฉ์ฑ์ ์ด๊ธ๋๊ฒ ๋ฉ๋๋ค.
2-3) REPEATABLE READ
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๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์คํ์ค์ธ ํธ๋์ญ์ ๊ฐ์ด๋ฐ ๊ฐ์ฅ ์ค๋๋ ํธ๋์ญ์ ๋ฒํธ๋ณด๋ค ํธ๋์ญ์ ๋ฒํธ๊ฐ ์์ ์ธ๋ ์์ญ์ ๋ฐ์ดํฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค.
์ ๊ทธ๋ฆผ์ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์ด ์๋ํ๋ ๋ฐฉ์์ ๋ํ๋ด๊ณ ์์ต๋๋ค.
๋จผ์ employees ํ ์ด๋ธ์ ๋ฒํธ๊ฐ 6์ธ ํธ๋์ญ์ ์ ์ํด INSERT๊ฐ ๋์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์ฌ์ฉ์ A๊ฐ emp_no = 50000์ธ ์ฌ์์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ณผ์ ์์ ์ฌ์ฉ์ B๊ฐ emp_no = 50000์ธ ์ฌ์์ SELECTํ ๋ ์ด๋ ํ ๊ณผ์ ์ ๊ฑฐ์ณ์ ์ฒ๋ฆฌ๋๋์ง ๋ณด์ฌ์ค๋๋ค.
์ฌ์ฉ์ A์ ํธ๋์ญ์ ๋ฒํธ๋ 12์ด๊ณ , ์ฌ์ฉ์ B์ ํธ๋์ญ์ ๋ฒํธ๋ 10์ ๋๋ค. ์ด๋ ์ฌ์ฉ์ A๋ ์ฌ์์ ์ด๋ฆ์ 'Toto'๋ก ๋ณ๊ฒฝํ๊ณ ์ปค๋ฐ์ ์ํํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ์ฉ์ B๋ emp_no = 50000์ธ ์ฌ์์ A ํธ๋์ญ์ ์ด ๋ณ๊ฒฝ์ ์คํํ๊ธฐ ์ ๊ณผ ์คํํ ํ ๊ฐ๊ฐ ์กฐํ๋ฅผ ํ์ง๋ง, ๋ฐ์ดํฐ๋ ํญ์ ๋์ผํ 'JuBal'๋ผ๋ ๊ฐ์ SELECTํฉ๋๋ค. ์ฌ์ฉ์ B๊ฐ BEGIN ๋ช ๋ น์ผ๋ก ํธ๋์ญ์ ์ ์์ํ๋ฉด์ 10๋ฒ์ด๋ผ๋ ํธ๋์ญ์ ๋ฒํธ๋ฅผ ๋ถ์ฌ๋ฐ์๋๋ฐ, ๊ทธ๋๋ถํฐ ์ฌ์ฉ์ B์ 10๋ฒ ํธ๋์ญ์ ์์์ ์คํ๋๋ ๋ชจ๋ SELECT ์ฟผ๋ฆฌ๋ ์์ ์ ํธ๋์ญ์ ์ธ 10๋ฒ ๋ณด๋ค ์์ ํธ๋์ญ์ ๋ฒํธ์์ ๋ณ๊ฒฝํ ๊ฒ๋ง ๋ณด๊ฒ ๋ฉ๋๋ค.
์ ๊ทธ๋ฆผ์์๋ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๊ฐ ํ๋๋ง ์๋๊ฒ์ผ๋ก ํํํ์ง๋ง, ์ค์ ๋ก๋ ํ๋์ ๋ ์ฝ๋์ ๋ํด ๋ฐฑ์ ์ด ํ๋ ์ด์ ์ผ๋ง๋ ์ง ์กด์ฌํ ์ ์์ต๋๋ค. ๋ง์ฝ ํ ์ฌ์ฉ์๊ฐ BEGIN ๋ช ๋ น์ผ๋ก ํธ๋์ญ์ ์ ์์ํ ํ ์ฅ์๊ฐ๋์ ํธ๋์ญ์ ์ ์ข ๋ฃํ์ง ์์ผ๋ฉด ์ธ๋ ์์ญ์ด ๋ฐฑ์ ๋ ๋ฐ์ดํฐ๋ก ๋ฌดํ์ ์ปค์ง ์ ์๊ณ , ์ด๋ ๊ฒ ์ธ๋ ์์ญ์ ๋ฐฑ์ ๋ ๋ ์ฝ๋๊ฐ ๋ง์์ง์๋ก MySQL ์๋ฒ์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
"PHANTOM READ(PHANTOM ROW)" - REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์
REPEATABLE ๊ฒฉ๋ฆฌ ์์ค์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ถ์ ํฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์ ์ฌ์ฉ์ A๊ฐ employees ํ ์ด๋ธ์ INSERT๋ฅผ ์คํํ๋ ๋์ค์ ์ฌ์ฉ์ B๊ฐ SELECT .. FOR UPDATE ์ฟผ๋ฆฌ๋ก employees ํ ์ด๋ธ์ ์กฐํํ์ ๋์ ๊ฒฐ๊ณผ์ ๋๋ค.
์ ๊ทธ๋ฆผ์์ ์ฌ์ฉ์ B๋ ํธ๋์ญ์ ์์(BEGIN) ํ SELECT ์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด์ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์์ ์ค๋ช ์ฒ๋ผ ๋์ผํ ํธ๋์ญ์ ๋ด์์๋ ๊ฒฐ๊ณผ๊ฐ ๋์ผํด์ผ ํฉ๋๋ค.
ํ์ง๋ง ์ ๊ทธ๋ฆผ์์ ์ฌ์ฉ์ B๊ฐ ์คํํ๋ ๋ ๋ฒ์ SELECT .. FOR UPDATE ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ ์๋ก ๋ค๋ฆ ๋๋ค. ์ด๋ ๊ฒ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ํํ ๋ณ๊ฒฝ ์์ ์ ์ํด ๋ ์ฝ๋๊ฐ ๋ณด์๋ค๊ฐ ์๋ณด์๋ค๊ฐ ํ๋ ํ์์ PHANTOM READ(PHANTOM ROW)๋ผ๊ณ ํฉ๋๋ค.
SELECT .. FOR UPDATE ์ฟผ๋ฆฌ๋ SELECTํ๋ ๋ ์ฝ๋์ ์ฐ๊ธฐ ์ ๊ธ์ ๊ฑธ์ด์ผ ํ๋๋ฐ, ์ธ๋ ๋ ์ฝ๋์๋ ์ ๊ธ์ ๊ฑธ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ ์ธ๋ ์์ญ์ ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ ํ์ฌ ๋ ์ฝ๋์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.
โป ํ์ง๋ง InnoDB์์๋ ๋ ํนํ ํน์ฑ ๋๋ฌธ์ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ PHANTOM READ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๊ณ ํฉ๋๋ค. ๋ฐ๋ผ์ MySQL์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์์๋ ์ฃผ๋ก REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ๋๊ฒ ์๋๊น ํ๋ ์๊ฐ์ ๋๋ค.
(2021.09.13 ์ถ๊ฐ) ์ฌ๊ธฐ์ ๋งํ๋ ๋ ํนํ ํน์ฑ์ด MVCC ๋ค์ค ๋ฒ์ ์ ์ด์ ๋๋ค. ์ฆ, MySQL-InnoDB๋ MVCC ๋ค์ค ๋ฒ์ ์ ์ด์ ์ํด PHANTOM READ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค. ์ถ๊ฐ ๋ด์ฉ์ด ๊ถ๊ธํ์๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์ :)
https://titanwolf.org/Network/Articles/Article?AID=4b782e0d-c711-48a6-a94a-e68abcdd05f9#gsc.tab=0
2-4) SERIALIZABLE
๊ฐ์ฅ ๋จ์ํ ๊ฒฉ๋ฆฌ ์์ค์ด๋ฉด์ ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ ๋๋ค. ๋ํ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ๋ ๋ค๋ฅธ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค๋ณด๋ค ํ์ ํ ๋จ์ด์ง๋๋ค.
ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ด SERIALIZABLE๋ก ์ค์ ๋๋ฉด ์ฝ๊ธฐ ์์ ๋ ๊ณต์ ์ ๊ธ(์ฝ๊ธฐ ์ ๊ธ)์ ํ๋ํด์ผ ํ๋ฉฐ, ๋์์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ทธ๋ฌํ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ฆ, ํ ํธ๋์ญ์ ์์ ์ฝ๊ณ ์ฐ๋ ๋ ์ฝ๋๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ์ ๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
SERIALIZABLE ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ผ๋ฐ์ ์ธ DBMS์์ ๋ฐ์ํ๋ "PHANTOM READ" ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ง๋ง, ์์์ ์ค๋ช ๋๋ ธ๋ฏ์ด InnoDB ์คํ ๋ฆฌ์ง ์์ง์์๋ REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค์์๋ "PHANTOM READ"๊ฐ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด SERIALIZABLE ๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ ํ์์ฑ์ ์์ด๋ณด์ ๋๋ค.
2-5) ์ ๋ฆฌ
๊ฐ๊ฐ์ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค ๋ฐ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ์ ๋ํด ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค
- READ UNCOMMITTED: ํธ๋์ญ์ ๋ด์์ ์ปค๋ฐํ์ง ์์ ๋ฐ์ดํฐ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ ๊ทผ์ด ๊ฐ๋ฅ
- READ COMMITTED: ํธ๋์ญ์ ๋ด์์ ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ง ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๋ ๊ฒ์ ํ์ฉ
- REPEATABLE READ: ํธ๋์ญ์ ๋ด์์ ํ ๋ฒ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณตํด์ ์กฐํํด๋ ๊ฒฐ๊ณผ๋ ๋์ผ
- SERIALIZABLE: ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ์๋ฒฝํ ์ฝ๊ธฐ ์ผ๊ด์ฑ ๋ชจ๋ ์ ๊ณต
๊ฒฉ๋ฆฌ ์์ค์ ๋ฐ๋ผ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์
- DIRTY READ: ์ด๋ ํ ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ ์์ ์ด ์๋ฃ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ณผ ์ ์๊ฒ ๋๋ ํ์
- NON-REPEATABLE READ: ๋์ผํ SELECT ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค๋ "REPEATABLE READ" ์ ํฉ์ฑ์ ์ด๊ธ๋๋ ํ์
- PHANTOM READ: ํ ํธ๋์ญ์ ๋ด์์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์ํํ๋๋ฐ, ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ์กด์ฌํ์ง ์๋ ์ ๋ น(Phantom) ๋ ์ฝ๋๊ฐ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ๋ํ๋๋ ํ์
References
'CS > Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Data MongoDB] - Auto Increment Sequence ์ด๊ธฐํํ๊ธฐ (0) | 2021.09.11 |
---|---|
[Spring Data MongoDB] Auto-Increment Sequence ๋ง๋ค๊ธฐ (0) | 2021.09.10 |
DBCP(DataBase Conncetion Pool), ์ปค๋ฅ์ ํ ์ด๋? (0) | 2021.08.10 |
์ฌ์ฉ์๊ฐ ๊ฒ์๋ฌผ์ ์์ฑํ ๋์ ํธ๋์ญ์ ์ฒ๋ฆฌ (6) | 2021.08.05 |
MongoDB CRUD(์์ฑ, ์กฐํ, ์์ , ์ญ์ ) ์ฟผ๋ฆฌ๋ฌธ (0) | 2021.07.26 |
๋๊ธ