2023. 2. 17. 17:32ใDatabase/DB ์คํฐ๋
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ด๋?
DB์์ ํธ๋์ญ์ ์ด๋ ํน์ ์์ ์ ์ํ DB ์ฐ์ฐ๋ค์ ๋ชจ์์ผ๋ก, ํ๋์ ์์ ๋จ์์ด๋ค.
ํธ๋์ญ์ ์ ACID๋ก ๋ถ๋ฆฌ๋ 4๊ฐ์ง ํน์ง์ ๊ฐ๋๋ค. ๋ค๋ง ์ด๋ฅผ ์๋ฒฝํ๊ฒ ์งํค๊ธฐ ์ํด์๋ ํธ๋์ญ์ ๋ค์ด ์์ ํ ๊ฒฉ๋ฆฌ๋์ด์ผ ํ๋๋ฐ, ์ด ๊ณผ์ ์์ DB์ ๋์์ฑ์ด ๊ณผ๋ํ๊ฒ ํฌ์๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ ํ๋ก ์ด์ด์ง ์ ์๋ค.
๊ทธ๋ ๋ค๊ณ ํธ๋์ญ์ ๊ฐ ๊ฒฉ๋ฆฌ๋ฅผ ํฌ๊ธฐํด๋ฒ๋ฆฌ๋ฉด DB์ ๋ฌด๊ฒฐ์ฑ, ์ผ๊ด์ฑ ์ธก๋ฉด์์ ๋ง์ ๋ฌธ์ ๋ค์ด ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์, DB์ ์ผ๊ด์ฑ๊ณผ ์ฑ๋ฅ์ ๋ชจ๋ ๊ณ ๋ คํ์ฌ ํธ๋์ญ์ ๊ฐ ๊ฒฉ๋ฆฌ๋๋ ์ ๋๋ฅผ ์ ์ ํ ์ ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ด๋ฅผ ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation Level)์ด๋ผ๊ณ ํ๋ค.
๊ฒฉ๋ฆฌ ์์ค์ ๊ณ ๋ คํ์ง ์์ผ๋ฉด ๋ฐ์ํ๋ ๋ฌธ์
1. Dirty Read
Dirty Read๋ ํธ๋์ญ์ ์ด ์์ง DB ์์ ์ปค๋ฐ๋์ง ์์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฝ์ด์ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํธ๋์ญ์ A๊ฐ id ๊ฐ์ 1๋ก ๊ฐ๋ ์ ๊ท ๋ฐ์ดํฐ๋ฅผ WRITEํ๊ณ ์๋ค๊ณ ๊ฐ์ ํ์. (์ปค๋ฐ์ ์์ง ์ด๋ฃจ์ด์ง์ง ์์.) ์ด ๋ ํธ๋์ญ์ B์์ READ ์ฐ์ฐ์ ํตํด ์ด๋ฅผ ์ฝ์ด์ค๋ ๊ฒ์ด Dirty Read ์ด๋ค.
์ด ๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ์ง์ ์, ๋ง์ฝ ํธ๋์ญ์ A๊ฐ ๋ชจ์ข ์ ์ด์ ๋ก ๋กค๋ฐฑ๋๊ธฐ๋ผ๋ ํ๋ค๋ฉด ๊ฒฐ๋ก ์ ์ผ๋ก ํธ๋์ญ์ B๋ DB์ ์กด์ฌํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์๋ค๋ ๊ฒ์ด๋ค.
์ด๋ DB์ ์ผ๊ด์ฑ์ ์น๋ช ์ ์ธ ๋ฌธ์ ์ ์ผ๋ก ์์ฉํ๋ค.
2. Non-Repeatable Read
Non-Repeatable Read๋ ํน์ ํธ๋์ญ์ ์์ ๋์ผํ READ ์ฐ์ฐ์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ์ ๋ READ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํธ๋์ญ์ A๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ id = 1 ๋ฐ์ดํฐ์ ๋ํด ๋ฐ๋ณต์ ์ผ๋ก READ ์์ ์ ์ํํ๊ณ , ํธ๋์ญ์ B๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ id = 1 ๋ฐ์ดํฐ์ ๋ํด UPDATE ์ฐ์ฐ์ ์ํํ๋ค๊ณ ๊ฐ์ ํ์. ์ด ๋ ํธ๋์ญ์ B๋ ํธ๋์ญ์ A์ ์ค๊ฐ์ ๋ฐ์ํ๊ณ ์์ ๊ณผ ๋์์ ์ปค๋ฐ์ด ์ด๋ฃจ์ด์ก๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ฌํ ์ํฉ์์ ํธ๋์ญ์ A๋ ์ด๊ธฐ์๋ ์์ ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ง๋ง, ํธ๋์ญ์ B๊ฐ ์ํ๋ ์ดํ์๋ ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋๋ค.
์ด๋ ๊ฒฐ๊ตญ ๋์ผ ํธ๋์ญ์ ์์ ์ํ๋ ๋์ผ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, DB ์ฐ์ฐ์ ์ผ๊ด์ฑ์ ํดํ๋ค.
3. Phantom Read
Phantom Read๋ ํน์ ํธ๋์ญ์ ์์ ๋์ผํ READ ์ฐ์ฐ์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ์ ๋ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํธ๋์ญ์ A๊ฐ ํน์ ํ ์ด๋ธ์ row์ ์์ ๋ํ ๋ฐ๋ณต์ ์ธ READ ์์ ์ ์ํํ๊ณ , ํธ๋์ญ์ B๊ฐ ํด๋น ํ ์ด๋ธ์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ , ํน์ ์ญ์ ์ฐ์ฐ์ ์ํํ๋ค๊ณ ๊ฐ์ ํ์. ์ด ๋ ํธ๋์ญ์ A๊ฐ ํธ๋์ญ์ B๋ณด๋ค ๋จผ์ ์์๋๊ณ , ๋์ค์ ๋๋๋ค๊ณ ํ ๋ ํธ๋์ญ์ A์ ๊ฒฐ๊ณผ๋ ํธ๋์ญ์ B์ ์ ํ๋ก ๋ฌ๋ผ์ง๊ฒ ๋๋ค. ์ด๋ฌํ ์ํฉ์ Phantom Read๋ผ๊ณ ํ๋ค.
Non-Repeatable Read VS Phantom Read
๋ ๋ฌธ์ ๋ชจ๋ ํน์ ํธ๋์ญ์ ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ํ๋๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ผ๊ด์ฑ์ ๋ํ ๋ฌธ์ ์ด๋ค.
๋ฐ๋ผ์ ๋ ๊ฐ์ ๋ฌด์จ ์ฐจ์ด๊ฐ ์กด์ฌํ๋์ง ์์ํ ์ ์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก
Non-Repeatable Read๋ ์ด์ ์ ์ฝ์ ํน์ ๋ฐ์ดํฐ(ํ๋์ ๋ ์ฝ๋)์ ๊ฐ์ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ๋ฌธ์ ์ ์ด๊ณ ,
Phantom Read๋ ์ด์ ์ ์ฝ์ ๋ฐ์ดํฐ์ ๋ฒ์(๋ฐ์ดํฐ์ ์ ๋ฌด) ์์ฒด๊ฐ ๋ฌ๋ผ์ ธ๋ฒ๋ฆฌ๋ ๊ฒ์ ๋ํ ๋ฌธ์ ์ ์ผ๋ก ๋ณผ ์ ์๋ค.
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ข ๋ฅ
1. READ UNCOMMITED
๊ฐ์ฅ ๋ฎ์ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก, ๋ค๋ฅธ ํธ๋์ญ์ ์ด READ, WRITE ์ค์ธ ๋ฐ์ดํฐ์ ์ปค๋ฐ, ๋กค๋ฐฑ ์ ์ ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
์ฆ, ํด๋น ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ด๋ ํ ๋ฝ๋ ์ฌ์ฉ๋์ง ์๋๋ค.
์ด๋ก ์ธํด Dirty Read, Non-Repeatable Read, Phantom Read ๋ฌธ์ ๊ฐ ๋ชจ๋ ๋ฐ์ํ๋ค.
2. READ COMMITED
๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ปค๋ฐ, ๋กค๋ฐฑํ ๋ฐ์ดํฐ ๋ง์ ์ฝ์ ์ ์๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
๊ฐ ํธ๋์ญ์ ์์ READ ์์ ์ ๊ทธ ๋น์์ DB ์ํ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ด ์๋,
๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ์ปค๋ฐ ์์ ์ด ์ํ๋ ์์ ์ DB ์ค๋ ์ท์ ํตํด READ ์์ ์ ์ํํ๋ค. (์ด๋ฅผ Consistent Read๋ผ๊ณ ํ๋ค.)
์ด๋ฅผ ํตํ๋ฉด Dirty Read ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง๋ง, Non-Repeatable Read, Phantom Read ๋ฌธ์ ๋ ๋ฐ์ํ ์ ์๋ค.
3. REPEATABLE READ
ํด๋น ๊ฒฉ๋ฆฌ ์์ค์ ํน์ ํธ๋์ญ์ ์ด ์ฒ์ READ ์ฐ์ฐ์ ์ํํ ์์ ์ ๊ธฐ์ค์ผ๋ก
๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก ์ปค๋ฐ ์์ ์ด ์ํ๋ ์์ ์ DB ์ค๋ ์ท์ ๊ฐ๊ณ , ์ดํ ํด๋น ํธ๋์ญ์ ์์ ๋ฐ์ํ๋ ๋ชจ๋ READ ์ฐ์ฐ์ ์ด ์ค๋ ์ท์ ํตํด ์ํํ๋ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค.
์ด๋ฅผ ํตํ๋ฉด ํน์ ํธ๋์ญ์ ์ด ๋ฐ๋ณต์ ์ผ๋ก READ ์ฐ์ฐ์ ์ํํ ๋ ๋ชจ๋ ๊ฐ์ ์์ ์ ์ค๋ ์ท์์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์
์ค๊ฐ์ ๋ค๋ฅธ ํธ๋์ญ์ ์์ UPDATE ์ฐ์ฐ์ด ๋ฐ์ํ๋๋ผ๋ ๋งค๋ฒ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
์ฆ, Dirty Read, Non-Repeatable Read ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
๋ค๋ง ์ด๋ฌํ ์ค๋ ์ท๋ค์ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๋ฐ์ํ INSERT, DELETE ์ฐ์ฐ์ ๋ํด์๋ ์ปค๋ฐ ์์ ์ ์์ ๋๊ธฐ ๋๋ฌธ์ Phantom Read ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
4. SERIALIZABLE
๊ฐ์ฅ ๋์ ์์ค์ ๊ฒฉ๋ฆฌ ์์ค์ด๋ค. ํด๋น ๊ฒฉ๋ฆฌ ์์ค์ ๋ชจ๋ ํธ๋์ญ์ ์ด ์ง๋ ฌ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
๋ฐ๋ผ์ Dirty Read, Non-Repeatable Read, PhantomRead ๋ฌธ์ ๊ฐ ๋ชจ๋ ํด๊ฒฐ๋๋ค.
๋ค๋ง, ํด๋น ๋ฐฉ์์ DB์ ๋์์ฑ์ ํด์น๊ณ ๋ฐ๋๋ฝ์ด ์ฝ๊ฒ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ์ ์ฌ์ฉ๋์ง ์๋๋ค.
์ฐธ์กฐ
https://suhwan.dev/2019/06/09/transaction-isolation-level-and-lock/
'Database > DB ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB ์คํ๊ณํ ํ์ธ๋ฒ(in PostgreSQL) (1) | 2023.11.11 |
---|---|
RDB vs NoSQL (0) | 2023.02.18 |
SQL Injection ๊ณต๊ฒฉ๊ณผ ๋์ (0) | 2023.02.11 |
์๋ฃ๊ตฌ์กฐ in DB ์ธ๋ฑ์ค (0) | 2023.02.11 |
DB ์คํฐ๋(4์ฃผ์ฐจ) (0) | 2022.12.24 |