๊ฐ๋
ํธ๋์ญ์
๊ฒฉ๋ฆฌ์์ค(isolation level)์ด๋ ๋์์ ์ฌ๋ฌ ํธ๋์ญ์
์ด ์ฒ๋ฆฌ๋ ๋, ํธ๋์ญ์
๋ผ๋ฆฌ ์ผ๋ง๋ ์๋ก ๊ณ ๋ฆฝ๋์ด ์๋์ง๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด๋ค.
์ฆ, ํน์ ํธ๋์ญ์
์ด ๋ค๋ฅธ ํธ๋์ญ์
์ ๋ณ๊ฒฝํ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๋๋ก ํ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ACID ํน์ง๊ณผ ๊ฐ์ด ํธ๋์ญ์ ์ด ๋ ๋ฆฝ์ ์ธ ์ํ์ ํ๋๋ก Locking์ ํตํด, ํธ๋์ญ์ ์ด DB๋ฅผ ๋ค๋ฃจ๋ ๋์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๊ด์ฌํ์ง ๋ชปํ๋๋ก ๋ง๋ ๊ฒ์ด ํ์ํ๋ค.
ํ์ง๋ง ๋ฌด์กฐ๊ฑด Locking์ผ๋ก ๋์์ ์ํ๋๋ ์๋ง์ ํธ๋์ญ์ ๋ค์ ์์๋๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๊ฒ ๋๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๋ฅ์ ๋จ์ด์ง๊ฒ ๋๋ค. ํ์ง๋ง, ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด Locking์ ๋ฒ์๋ฅผ ์ค์ธ๋ค๋ฉด, ์๋ชป๋ ๊ฐ์ด ์ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ ์ต๋ํ ํจ์จ์ ์ธ Locking ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
- Lock : ํธ๋์ญ์
์ฒ๋ฆฌ์ ์์ฐจ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด๋ค.(๋์์ฑ ์ ์ด)
DBMS ๋ง๋ค Lock์ ๊ตฌํํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ DBMS๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ด์ฉํ๊ธฐ ์ํด์ ํด๋น DB์ Lock์ ๋ํ ์ดํด๊ฐ ์๊ตฌ๋๋ค.- ๊ณต์ (shared) lock : ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ์ฌ์ฉ๋์ด์ง๋ lock.
- ๊ณต์ ๋ฝ์ ๊ณต์ ๋ฝ๋ผ๋ฆฌ ๋์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
- ํ์ง๋ง, ๊ณต์ ๋ฝ์ด ์ค์ ๋ ๋ฐ์ดํฐ์ ๋ฐฐํ ๋ฝ์ ์ฌ์ฉํ ์๋ ์๋ค.
- ๋ฐฐํ(Exclusive) lock : ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋๋ฉฐ, ํธ๋์ญ์
์ด ์๋ฃ๋ ๋๊น์ง ์ ์ง๋๋ค.
- Lock์ด ํด์ ๋ ๋๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ (์ฝ๊ธฐ ํฌํจ)์ ํด๋น ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ค.
- ํด๋น Lock์ ํธ๋์ญ์ ์ด ์ํ๋๊ณ ์๋ ๋ฐ์ดํฐ์ ๋ํด์๋ ์ ๊ทผํ์ฌ ํจ๊ป Lock์ ์ค์ ํ ์ ์๋ค.
- ๊ณต์ (shared) lock : ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ์ฌ์ฉ๋์ด์ง๋ lock.
Isolation level ์ข ๋ฅ
- Read Uncommitted (๋ ๋ฒจ 0)
- SELECT ๋ฌธ์ฅ์ด ์ํ๋๋ ๋์ ํด๋น ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ์ง ์๋ ๊ณ์ธต
- ํธ๋์ญ์ ์ ์ฒ๋ฆฌ์ค์ด๊ฑฐ๋, ์์ง Commit๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ๋ ๊ฒ์ ํ์ฉํจ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํจ
- Dirty Read ๋ฐ์
- A ํธ๋์ญ์ ์์ 10๋ฒ ์ฌ์์ ๋์ด๋ฅผ 27์์ 28๋ก ๋ฐ๊ฟ. ์์ง ์ปค๋ฐํ์ง ์์
- B ํธ๋์ญ์
์์ 10๋ฒ ์ฌ์์ ๋์ด๋ฅผ ์กฐํ : ๊ฒฐ๊ณผ 28 → ๋ํฐ ๋ฆฌ๋(Dirty Read)
- ์ด ์ดํ, A ํธ๋์ญ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํด Rollbackํจ
- B ํธ๋์ญ์ ์ 10๋ฒ ์ฌ์์ด ์ฌ์ ์ด 28์ด์ด๋ผ ์๊ฐํ๊ณ ๋ก์ง์ ์ํํจ
- ์ด๋ฐ์์ผ๋ก ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ๋ง์์ง.
- Read Committed (๋ ๋ฒจ 1)
- SELECT ๋ฌธ์ฅ์ด ์ํ๋๋ ๋์ ํด๋น ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ๋ ๊ณ์ธต
- ํธ๋์ญ์ ์ด ์ํ๋๋ ๋์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ ๊ทผํ ์ ์์ด ๋๊ธฐํ๊ฒ ๋จ
- Commit ์ด ์ด๋ฃจ์ด์ง ํธ๋์ญ์ ๋ง ์กฐํ ๊ฐ๋ฅ
- Oracle DB, SQL Server์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ Ioslation Level์
- Non-Repeatable Read ๋ฐ์
- B ํธ๋์ญ์ ์์ 10๋ฒ ์ฌ์์ ๋์ด๋ฅผ ์กฐํ : ๊ฒฐ๊ณผ 27
- A ํธ๋์ญ์ ์์ 10๋ฒ ์ฌ์์ ๋์ด๋ฅผ 27์์ 28๋ก ๋ฐ๊พธ๊ณ ์ปค๋ฐ
- B ํธ๋์ญ์ ์์ 10๋ฒ ์ฌ์์ ๋์ด๋ฅผ ์กฐํ : ๊ฒฐ๊ณผ 28
- Repeatable Read (๋ ๋ฒจ 2)
- ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT ๋ฌธ์ฅ์ด ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ๋ ๊ณ์ธต
- ํธ๋์ญ์ ์ด ๋ฒ์ ๋ด์์ ์กฐํํ ๋ฐ์ดํฐ ๋ด์ฉ์ด ํญ์ ๋์ผํจ์ ๋ณด์ฅํจ
- ๋ค๋ฅธ ์ฌ์ฉ์๋ ํธ๋์ญ์ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ๋ถ๊ฐ๋ฅ
- MySQL DBMS์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํจ
- Non-Repeatable Read ๋ถ์ ํฉ์ด ๋ฐ์ํ์ง ์์
- 10๋ฒ ํธ๋์ญ์ ์ด 500๋ฒ ์ฌ์์ ์กฐํ
- 12๋ฒ ํธ๋์ญ์ ์ด 500๋ฒ ์ฌ์์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ณ ์ปค๋ฐ
- 10๋ฒ ํธ๋์ญ์ ์ด 500๋ฒ ์ฌ์์ ๋ค์ ์กฐํ : undo ์์ญ์ ๋ฐฑ์ ๋ ๋ฐ์ดํฐ ๋ฐํ
- ์ฆ, ์์ ์ ํธ๋์ญ์
๋ฒํธ๋ณด๋ค ๋ฎ์ ํธ๋์ญ์
๋ฒํธ์์ ๋ณ๊ฒฝ๋(์ปค๋ฐ๋) ๊ฒ๋ง ๋ณด๊ฒ ๋๋ค.
- ๋ชจ๋ InnoDB์ ํธ๋์ญ์ ์ ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ณ ์ ํ ํธ๋์ญ์ ๋ฒํธ๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ,
- undo ์์ญ์ ๋ฐฑ์ ๋ ๋ชจ๋ ๋ ์ฝ๋๋ ๋ณ๊ฒฝ์ ๋ฐ์์ํจ ํธ๋์ญ์ ์ ๋ฒํธ๋ฅผ ํฌํจํ๊ณ ์๋ค.
- Phantom Read ๋ฐ์
- Serializable (๋ ๋ฒจ 3)
- ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง SELECT ๋ฌธ์ฅ์ด ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ฐ์ดํฐ์ Shared Lock์ด ๊ฑธ๋ฆฌ๋ ๊ณ์ธต
- ๊ฐ์ฅ ์๊ฒฉํ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก ์๋ฒฝํ ์ฝ๊ธฐ ์ผ๊ด์ฑ ๋ชจ๋๋ฅผ ์ ๊ณตํจ
- ๋ค๋ฅธ ์ฌ์ฉ์๋ ํธ๋์ญ์ ์์ญ์ ํด๋น๋๋ ๋ฐ์ดํฐ์ ๋ํ ์์ ๋ฐ ์ ๋ ฅ ๋ถ๊ฐ๋ฅ
๋ ๋ฒจ์ด ๋์์ง ์๋ก ํธ๋์ญ์ ๊ฐ ๊ณ ๋ฆฝ ์ ๋๊ฐ ๋์์ง๋ฉฐ, ์ฑ๋ฅ์ด ๋จ์ด์ง๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ฉฐ, ์ผ๋ฐ์ ์ธ ์จ๋ผ์ธ ์๋น์ค์์๋ READ COMMITTED๋ REPEATABLE READ ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ค. (Oracle = READ COMMITTED, MySQL = REPEATABLE READ)
์ ํ ์ ๊ณ ๋ ค์ฌํญ
Isolation Level์ ๋ํ ์กฐ์ ์, ๋์์ฑ๊ณผ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ฐ๊ด๋์ด ์๋ค.
๋์์ฑ์ ์ฆ๊ฐ์ํค๋ฉด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ , ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ฉด ๋์์ฑ์ด ๋จ์ด์ง๊ฒ ๋๋ค.
๋ ๋ฒจ์ ๋๊ฒ ์กฐ์ ํ ์๋ก ๋ฐ์ํ๋ ๋น์ฉ์ด ์ฆ๊ฐํ๋ค.
- ๋ฌด๊ฒฐ์ฑ(Integrity) : ๋ฐ์ดํฐ์ ์ ํ์ฑ, ์ผ๊ด์ฑ, ์ ํจ์ฑ์ด ์ ์ง๋๋ ๊ฒ
- ๊ฐ์ฒด ๋ฌด๊ฒฐ์ฑ : ๋ชจ๋ ํ ์ด๋ธ์ด ๊ธฐ๋ณธํค๋ก ์ ํ๋ ํ๋๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.(๊ธฐ๋ณธํค๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.) ๊ณ ์ ํ ๊ฐ, NULL ํ์ฉ ํ์ง ์์.
- ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ : ์ฐธ์กฐ ๊ด๊ณ์ ์๋ ๋ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ํญ์ ์ผ๊ด๋ ๊ฐ์ ๊ฐ๋๋ก ์ ์ง. ์ฐธ์กฐ ๋์์ด ์กด์ฌํ์ง ์๋ ์ธ๋ ํค๋ฅผ ํ์ฉํ์ง ์๋๋ค.
- RESTRICTED : ๋ ์ฝ๋๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด, ๋ณ๊ฒฝ ๋๋ ์ญ์ ์ฐ์ฐ์ ์ทจ์
- CASCADE : ๋ ์ฝ๋๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๋๋ ์ญ์
- SET NULL : ๋ ์ฝ๋๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด์ ๊ฐ์ NULL๋ก ์ค์
- ๋๋ฉ์ธ ๋ฌด๊ฒฐ์ฑ : ํ ์ด๋ธ์ ์กด์ฌํ๋ ํ๋์ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ. ํ๋์ ํ์ , null๊ฐ์ ํ์ฉ ๋ฑ ์ฌํญ์ ์ ์ํ๊ณ ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋์๋์ง ํ์ธํ๋ ๊ฒ
- ๋ฌด๊ฒฐ์ฑ ๊ท์น : ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์งํค๊ธฐ ์ํ ๋ชจ๋ ์ ์ฝ ์ฌํญ์ ๋งํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ ๊ท์น
๋ฎ์ ๋จ๊ณ Isolation Level์ ํ์ฉํ ๋ ๋ฐ์ํ๋ ํ์๋ค
- Dirty Read
- ์ด๋ค ํธ๋์ญ์ ์์ ์์ง ์คํ์ด ๋๋์ง ์์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํ ๋ณ๊ฒฝ์ฌํญ์ ๋ณด๊ฒ๋๋ ๊ฒฝ์ฐ
- ์ปค๋ฐ๋์ง ์์ ์์ ์ค์ธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ฝ์ ์ ์๋๋ก ํ์ฉํ ๋ ๋ฐ์ํ๋ ํ์
- Non-Repeatable Read
- ํ ํธ๋์ญ์ ์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์ํํ ๋ ๊ทธ ์ฌ์ด์ ๋ค๋ฅธ ํธ๋์ญ์ ๊ฐ์ ์์ ๋๋ ์ญ์ ํ๋ฉด์ ๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์์ดํ๊ฒ ๋ํ๋๋ ์ผ๊ด์ฑ์ด ๊นจ์ง ํ์
- ํ ํธ๋์ญ์ ์์ ๋๊ฐ์ SELECT๋ฅผ ์ํํ์ ๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ผ ํ๋ค๋ Repeatable Read ์ ํฉ์ฑ์ ์ด๊ธ๋จ
- Phantom Read
- ํ ํธ๋์ญ์ ์์์ ์ผ์ ๋ฒ์์ ๋ ์ฝ๋๋ฅผ ๋ ๋ฒ ์ด์ ์ฝ์์ ๋, ์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ์๋ ๋ ์ฝ๋๊ฐ ๋๋ฒ์งธ ์ฟผ๋ฆฌ์์ ๋ํ๋๋ ํ์
- ํธ๋์ญ์ ๋์ค ์๋ก์ด ๋ ์ฝ๋ ์ฝ์ ์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ํ๋จ
Isolation Level | Dirty Read | Non-Reapeatable Read | Phantom Read |
Read Uncommitted | O | O | O |
Read committed | - | O | O |
Repeatable Read | - | - | O |
Serializable | - | - | - |
์ฐธ๊ณ
'๐CS > DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DB] ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ์ฑ๋ฅ (0) | 2021.08.04 |
---|---|
[DB] ํธ๋์ญ์ ์ ํ ์ค์ (0) | 2021.05.02 |
[DB] ํธ๋์ญ์ (Transaction) (0) | 2021.04.23 |
[DB] ์บ์, Redis (0) | 2021.04.18 |
[DB] Connection Pool (0) | 2021.04.18 |
๋๊ธ