๐ŸŽ [DB] ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€ ์ •๋ฆฌ

์œค์ฃผํ›ˆยท2026๋…„ 3์›” 2์ผ

DB

๋ชฉ๋ก ๋ณด๊ธฐ
2/2

๐ŸŽ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์„ ์ •๋ฆฌํ•ด๋ณด์ž

  • ์ทจ์ง€: ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์€ ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ๊ณ  ์–ด๋–ค ์ˆ˜์ค€์—์„œ ์–ด๋–ป๊ฒŒ ์จ์•ผํ• ์ง€ ์ด์ฐธ์— ์ •๋ฆฌ๋ฅผ ํ•˜๊ณ  ๊ฐ€๋ ค๊ณ  ๊ธ€์„ ๋‚จ๊ฒจ๋ณธ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ: https://www.youtube.com/watch?v=yWO13BNyuw4&list=WL&index=17

Level 0: READ UNCOMMITTED

  • ๊ฐœ๋…: "๊ฒฉ๋ฆฌ์„ฑ ๋ฌด์‹œ"
    • ํŠธ๋žœ์žญ์…˜์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด Commit์ด๋‚˜ Rollback์— ์ƒ๊ด€์—†์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.
    • ์น˜๋ช…์  ๊ฒฐํ•จ: Dirty Read (์กด์žฌํ•˜์ง€๋„ ์•Š๋Š” ์œ ๋ น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Œ)

Example

Tx 1: UPDATE ๊ณ„์ขŒ SET ์ž”์•ก=50(์ง„ํ–‰ ์ค‘)
Tx 2: SELECT ์ž”์•ก -> 50๋งŒ์› ์ฝ์Œ(Dirty Read!)
Tx 1: ์„œ๋ฒ„ ์—๋Ÿฌ ๋ฐœ์ƒ -> ROLLBACK(์ž”์•ก 0์›)

Level 1: READ COMMITTED

  • ๊ฐœ๋…: "ํ™•์ •๋œ ๊ฒƒ๋งŒ ๋ฏฟ๋Š”๋‹ค"
    • ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์˜ ๋ณ€๊ฒฝ๋‚ด์šฉ์ด Commit ๋˜์–ด์•ผ๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•ด๊ฒฐ: Dirty Read ๋ฐฉ์ง€
    • ๋ฌธ์ œ: Non-repeatable Read ๋ฐœ์ƒ๊ฐ€๋Šฅ(์กฐํšŒํ•  ๋–„๋งˆ๋‹ค ๊ฐ’์ด ๋ณ€ํ•จ)
    • Oracle, PostgreSQL ์˜ ๊ธฐ๋ณธ ์„ค์ •๊ฐ’

Example

Tx 1: UPDATE ์ž”์•ก=50 (Commit ์ „)
Tx 2: SELECT ์ž”์•ก -> 100๋งŒ์› ์กฐํšŒ(Dirty Read ๋ฐฉ์ง€!)
Tx 1: Commit (์ˆ˜์ • ํ™•์ •)
Tx 2: ๋‹ค์‹œ SELECT ์ž”์•ก -> 50๋งŒ์› ์กฐํšŒ(Non-reapeatable Read!)
-- ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜๋‚ด์—์„ธ ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

Level 2: REPEATABLE READ

  • ๊ฐœ๋…: "์ฒ˜์Œ ๋ณธ ์Šค๋ƒ…์ƒท ์œ ์ง€"
    • ํ•ด๊ฒฐ: Non-repeatable Read ๋ฐฉ์ง€!
    • ํ•œ๊ณ„: Phantom Read ๋ฐœ์ƒ ๊ฐ€๋Šฅ(์ƒˆ๋กœ์šด ํ–‰ ์‚ฝ์ž… ์‹œ ๊ฒฐ๊ณผ ํ–‰ ๊ฐœ์ˆ˜ ๋ณ€ํ™”)
    • MYSQL InnoDB, PostgreSQL ์€ ๊ฐ์ž์˜ ๊ธฐ์ˆ (Next-Key Lock, Snapshot isolation)๋กœ ์ด ๋ ˆ๋ฒจ์—์„œ ํŒฌํ…€ ๋ฆฌ๋“œ๊นŒ์ง€ ๋Œ€๋ถ€๋ถ„ ๋ฐฉ์–ด

Example

Tx 1: SELECT ์ž”์•ก -> 100๋งŒ์›(Snapshot Read)
Tx 2: UPDATE ์ž”์•ก=50; COMMIT;
Tx 1: ๋‹ค์‹œ ์กฐํšŒ -> 100๋งŒ์› ์กฐํšŒ(๋ฐ˜๋ณต ์ฝ๊ธฐ ๋ณด์žฅ!)
Tx 2: INSERT ID=11 ์‹ ๊ทœ ํ–‰; COMMIT;
TX 1: ๋ฒ”์œ„ SELECT -> ํ–‰ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚จ(ANSI Phantom Read ํ˜„์ƒ)

Level 3: SERIALIZABLE

  • ๊ฐœ๋…: "์™„๋ฒฝํ•œ ๊ฒฉ๋ฆฌ"
    • ํŠธ๋žœ์žญ์…˜๋“ค์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.
    • ๊ธฐ์ˆ (ANSI): ์ฝ๊ธฐ ์ž‘์—…์กฐ์ฐจ ๊ณต์œ  ์ž ๊ธˆ(S-LOCK)์„ ํš๋“ํ•ด์•ผ ํ•จ.
    • ํ•ด๊ฒฐ: Phantom Read ํฌํ•จ ๋ชจ๋“  ์ด์ƒ ํ˜„์ƒ ๋ฐฉ์ง€
    • MYSQL Inno DB๋Š” ๋ชจ๋“  SELECT์— Shared Next-key Lock์„ ๊ฐ•์ œํ•˜์—ฌ ์ธ์ ‘ ๋ฒ”์œ„๊นŒ์ง€ ๋ชจ๋‘ ์ž ๊ทผ๋‹ค.

Example

Tx 1: SELECT * WHERE ๊ฐ€๊ฒฉ > 100 (Shared Next-Key Lock)
Tx 2: INSERT ์ƒํ’ˆ (๊ฐ€๊ฒฉ=150) ์‹œ๋„ -> ๋ฌดํ•œ ๋Œ€๊ธฐ(Wait)
Tx 1: ๋‹ค์‹œ ๊ฐ™์€ SELECT -> ์ •ํ•ฉ์„ฑ ์™„์ „ ๋ณด์žฅ
Tx 1: COMMIT (Lock ํ•ด์ œ)
Tx 2: ๊ทธ์ œ์„œ์•ผ ์‚ฝ์ž… ์ž‘์—… ์ˆ˜ํ–‰
profile
Dont regret it will be your future

0๊ฐœ์˜ ๋Œ“๊ธ€