๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT

[DATABASE] ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ž€?

by ๐Ÿ’ฒ๐ŸŽตโœ–๏ธโœ”๏ธโ˜ผ 2022. 11. 3.
728x90

ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(isolation level)์ด๋ž€?

  • ๋™์‹œ์— ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜๋ฆฌ๋  ๋•Œ, ํŠน์ • ํŠธ๋žœ์žญ์…˜์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์˜ ํ•„์š”์„ฑ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ACID ๊ฐ™์ด ํŠธ๋žœ์žญ์…˜์ด ์›์ž์ ์ด๋ฉด์„œ๋„ ๋…๋ฆฝ์ ์ธ ์ˆ˜ํ–‰์„ ํ•˜๋„๋ก ํ•œ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์ด DB๋ฅผ ๋‹ค๋ฃจ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ด€์—ฌํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š” Locking์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋“ฑ์žฅํ•œ๋‹ค.
  • ๋ฌด์กฐ๊ฑด์ ์ธ Locking ์œผ๋กœ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ๋งŽ์€ ํŠธ๋žœ์žญ์…˜๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ์‹œ์— DB ์„ฑ๋Šฅ์€ ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.
  • ๋ฐ˜๋Œ€๋กœ, ์‘๋‹ต์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด Locking ๋ฒ”์œ„๋ฅผ ์ค„์ธ๋‹ค๋ฉด ์ž˜๋ชป๋œ ๊ฐ’์ด ์ฒ˜๋ฆฌ๋  ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค.
  • ์ตœ๋Œ€ํ•œ ํšจ์œจ์ ์ธ Locking ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์˜ ์ข…๋ฅ˜

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SELIALIZABLE

READ UNCOMMITTED (Level 0)

  • ๊ฐ ํŠธ๋žœ์žญ์…˜์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด COMMIT / ROLLBACK ์—ฌ๋ถ€์— ์ƒ๊ด€ ์—†์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ •ํ•ฉ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ๋งŽ์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.
  • ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด COMMIT ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ง€๋งŒ, UPDATE ๋œ ๊ฐ’์„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

READ COMMITTED (Level 1)

  • ๋Œ€๋ถ€๋ถ„์˜ RDB ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.
  • Dirty Read ์™€ ๊ฐ™์€ ํ˜„์ƒ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์‹ค์ œ ํ…Œ์ด๋ธ” ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, Undo ์˜์—ญ์˜ ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ๋˜‘๊ฐ™์€ SELECT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์˜€์„ ๋•Œ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” REPEATABLE READ์˜ ์ •ํ•ฉ์„ฑ์— ์–ด๊ธ‹๋‚œ๋‹ค.

REPEATABLE READ (Level 2)

  • MySQL ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜๋งˆ๋‹ค ํŠธ๋žœ์žญ์…˜ ID ๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ํ•ด๋‹น ID ๋ณด๋‹ค ์ž‘์€ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ์—์„œ ๋ณ€๊ฒฝํ•œ ๊ฒƒ๋งŒ ์ฝ๊ฒŒ ๋œ๋‹ค.
  • Undo ๊ณต๊ฐ„์— ๋ฐฑ์—…ํ•ด๋‘๊ณ  ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
  • ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ์‹œ์ ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œํ•œ๋‹ค.
  • Undo์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง€๋ฉด, MySQL ์„œ๋ฒ„์˜ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ๋ฐฉ์‹์„ MVCC(Multi Version Concurrency Control)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

SERIALIZABLE (Level 3)

  • ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด์ง€๋งŒ ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.
  • ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ๋Š” ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ๋‚ฎ๋‹ค.
  • SERIALIZABLE ์—์„œ๋Š” PHANTOM READ ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ, DB์—์„œ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋‚ฎ์€ ๋‹จ๊ณ„์˜ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์ด์šฉ ์‹œ์— ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ

Dirty Read

  • ํŠธ๋žœ์žญ์…˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ํ˜„์ƒ

Non-Repeatable Read

  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ์ˆ˜ํ–‰ํ•  ๋•Œ, ๋‘ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์ดํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ๋น„์ผ๊ด€์„ฑ ํ˜„์ƒ
  • ํ•œ ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜ํ–‰ ์ค‘์ผ ๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ’์„ ์ˆ˜์ • ๋˜๋Š” ์‚ญ์ œํ•จ์œผ๋กœ์จ ๋‚˜ํƒ€๋‚œ๋‹ค.

Phantom Read

  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ์—†๋˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ
  • ํ•œ ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜ํ•ด ์ค‘์ผ ๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ INSERT ํ•จ์œผ๋กœ์จ ๋‚˜ํƒ€๋‚œ๋‹ค.

RDB(MySQL, Oracle) ๊ธฐ๋ณธ Isolation Level

  • MySQL : REPEATABLE READ
  • ORACLE : READ COMMITTED

Oracle ์€ READ COMMITTED ์™€ SERIALIZABLE ๋งŒ ์ง€์›ํ•˜๋ฉฐ, ๋‚˜๋จธ์ง€ ๋‘ ๊ฐ€์ง€ Isolation level ์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฐธ๊ณ 

https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation

https://doooyeon.github.io/2018/09/29/transaction-isolation-level.html

๋Œ“๊ธ€