[DB]๐ŸšฆIsolation Level(๊ฒฉ๋ฆฌ ์ˆ˜์ค€)์ด๋ž€?

Sangho Hanยท2025๋…„ 6์›” 10์ผ
2

๐Ÿงฑ DB

๋ชฉ๋ก ๋ณด๊ธฐ
3/4
post-thumbnail

๐ŸšฆDB Isolation Level(๊ฒฉ๋ฆฌ ์ˆ˜์ค€)์ด๋ž€?

์ด์ „์— DB ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•œ ๊ธ€์„ ์ •๋ฆฌํ•˜๋ฉด์„œ, ํŠน์ง• ์ค‘ ๊ฒฉ๋ฆฌ์„ฑ ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณด์•˜๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜์ง€๋งŒ, ์–ผ๋งˆ๋‚˜ ๋…๋ฆฝ์ ์ธ์ง€์˜ ์ •๋„์—์„œ๋Š” ์ฐจ์ด๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์ด๋ฅผ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋  ๋•Œ, ์„œ๋กœ์˜ ์ž‘์—…์ด ์–ด๋А ์ •๋„๊นŒ์ง€ ๊ฒฉ๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ธฐ์ค€์ด ๋œ๋‹ค.

๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ 4๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ฒฉ๋ฆฌ์„ฑ์ด ๋‚ฎ์€(= ๋™์‹œ์„ฑ์ด ๋†’์€) ์ˆœ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

์ด๋ฏธ์ง€ ๋ฐ ๋‚ด์šฉ ์ถœ์ฒ˜


๐Ÿ“Œ 1. READ UNCOMMITTED

READ UNCOMMITTED ๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.

  1. ์‚ฌ์šฉ์ž A๊ฐ€ id=51์˜ ๋ฉค๋ฒ„๋ฅผ INSERT ํ•œ๋‹ค.
  2. ์‚ฌ์šฉ์ž B๊ฐ€ id=51์˜ ๋ฉค๋ฒ„๋ฅผ SELECT ํ•œ๋‹ค.
  3. ์•„์ง COMMIT ๋˜์ง€ ์•Š์•˜์Œ์—๋„, ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค.

์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š”๊ฐ€?

COMMIT์ด ๋˜์ง€ ์•Š์•˜๊ธฐ์—, ์•„์ง ๋กœ๊ทธ์™€ ๋ฐ์ดํ„ฐ ๋ชจ๋‘ ๋””์Šคํฌ์— ์“ฐ์ด์ง€ ์•Š์€ ์ƒํ™ฉ์ธ๋ฐ ์‚ฌ์šฉ์ž B์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์—ˆ์„๊นŒ?

์ด๋Š” ์‚ฌ์šฉ์ž A๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ๋ณ€๊ฒฝํ•œ ๋ฒ„ํผ ํ’€์˜ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ์ฝ์—ˆ๊ธฐ์— ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž B๊ฐ€ ์ฝ์€ ๋ฒ„ํผ ํ’€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋”ํ‹ฐ ํŽ˜์ด์ง€ ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋”ํ‹ฐ ํŽ˜์ด์ง€(Dirty Page)๋ž€?

๋ฒ„ํผ ํ’€์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ค‘, ์•„์ง ๋””์Šคํฌ์— flush๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜ ํŽ˜์ด์ง€๋ฅผ ๋งํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋”ํ‹ฐ(Dirty) ๋ž€ ์›๋ณธ๊ณผ ๋‹ฌ๋ผ์ง„ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜๋Š” ์šฉ์–ด์ด๋‹ค.

๋ชจ๋“  ๋”ํ‹ฐ ํŽ˜์ด์ง€๊ฐ€ ์œ„ํ—˜ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ํŠธ๋žœ์žญ์…˜์ด ๋งŒ๋“  ๋”ํ‹ฐ ํŽ˜์ด์ง€๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ฝ์œผ๋ฉด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

๋”ํ‹ฐ ๋ฆฌ๋“œ(Dirty Read)๋ž€?

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž B๊ฐ€ ํ•œ ํ–‰์œ„๋ฅผ ๋”ํ‹ฐ ๋ฆฌ๋“œ ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ด๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์•„์ง COMMITํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ํ˜„์ƒ์œผ๋กœ, ์œ„์—์„œ ๋งํ•œ ๋”ํ‹ฐ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ํ‹ฐ ๋ฆฌ๋“œ๊ฐ€ ์™œ ๋ฌธ์ œ์ธ๊ฐ€?

์‚ฌ์šฉ์ž B๊ฐ€ ๋”ํ‹ฐ ๋ฆฌ๋“œ๋ฅผ ํ•œ ์ดํ›„์—, ์‚ฌ์šฉ์ž A์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ROLLBACK์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

  1. ROLLBACK -> id=51์ธ ๋ฉค๋ฒ„๋Š” ํ…Œ์ด๋ธ”์—์„œ ์‚ฌ๋ผ์ง„๋‹ค.
  2. ์‚ฌ์šฉ์ž B์˜ ํŠธ๋žœ์žญ์…˜์€ ๊ณ„์† ์ง„ํ–‰์ค‘
  3. ์กฐํšŒํ•œ id=51 ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๊ณ„์† ์ˆ˜ํ–‰ (๊ฒฐ์ œ, ์—ฐ๊ด€ ํ…Œ์ด๋ธ” INSERT ๋“ฑ)
  4. ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ๊นจ์ง€๊ฒŒ ๋จ

๋”ํ‹ฐ ๋ฆฌ๋“œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ๋ฅผ ์‹ ๋ขฐํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ์ ์—์„œ ์‹œ์Šคํ…œ ์ „๋ฐ˜์˜ ์ •ํ•ฉ์„ฑ & ๋ฌด๊ฒฐ์„ฑ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ํ›ผ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ READ UNCOMMITTED๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ด ๊ถŒ์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ตœ์†Œํ•œ READ COMMITTED ์ด์ƒ์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๊ถŒ์žฅํ•œ๋‹ค.

์–ธ์ œ ์“ฐ์ด๋Š”๊ฐ€?

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ์œ„ํ—˜ํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ์–ธ์ œ ์“ฐ์ด๋Š”์ง€์— ๋Œ€ํ•œ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ธด๋‹ค.

READ UNCOMMITTED ๋Š” ์ •ํ•ฉ์„ฑ์ด ๋‚ฎ์€ ๋งŒํผ ์ผ๋ฐ˜์ ์ธ ์„œ๋น„์Šค์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ํŠน์ • ๋ชฉ์ ์— ํ•œ์ •ํ•ด โ€œ์ฝ๊ธฐ ์„ฑ๋Šฅโ€์„ ๊ทน๋‹จ์ ์œผ๋กœ ๋†’์ด๊ณ  ์‹ถ์„ ๋•Œ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋‹ˆํ„ฐ๋ง & ํ†ต๊ณ„์„ฑ ์ฟผ๋ฆฌ & ๋กœ๊น… ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ์—์„œ ์•ฝ๊ฐ„์˜ ์˜ค์ฐจ๋Š” ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์“ฐ์ด๊ณค ํ•œ๋‹ค.


๐Ÿ“Œ 2. READ COMMITTED

READ COMMITTED ๋Š” ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.

๋”ํ‹ฐ ๋ฆฌ๋“œ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ

์‚ฌ์šฉ์ž A๊ฐ€ id=50์ธ ๋ฉค๋ฒ„์˜ ์ด๋ฆ„์„ MinKyu๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ง„ํ–‰์ค‘์ด๋ผ๊ณ  ํ•ด๋ณด์ž.

์œ„ ์ด๋ฏธ์ง€ ์ƒ์œผ๋กœ๋Š” UPDATE ๋ฌธ์ด ์‹คํ–‰๋˜์—ˆ๊ณ , ์•„์ง COMMIT ์ „์ด๊ธฐ์— ๋ฒ„ํผ ํ’€ ๋‚ด์—์„œ ์ €์žฅ๋œ๋‹ค.
๋˜ํ•œ UNDO ๋กœ๊ทธ์—๋Š” ๋ณ€๊ฒฝ ์ด์ „์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๋ก๋œ๋‹ค.

์ด ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž B์˜ ํŠธ๋žœ์žญ์…˜์—์„œ id=50 ๋ฉค๋ฒ„์˜ ์ด๋ฆ„์„ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค๊ณ  ํ•ด ๋ณด์ž.

์•„์ง COMMIT ์ด์ „์ด๊ธฐ ๋•Œ๋ฌธ์—, UNDO ๋กœ๊ทธ์—์„œ ๋ณ€๊ฒฝ ์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž B๋Š” MangKyu ๋ผ๋Š” ์ด์ „์˜ ์ด๋ฆ„์„ ๊ฒฐ๊ณผ๋กœ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

์ฆ‰, ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ์ง์ ‘ ์ฝ์ง€ ์•Š๊ณ , UNDO ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ ์ด์ „์˜ ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ ๋ฒ„์ „์„ ์ฝ๊ธฐ ๋•Œ๋ฌธ์— ๋”ํ‹ฐ ๋ฆฌ๋“œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

์–ธ์ œ ์“ฐ์ด๋Š”๊ฐ€?

READ COMMITTED๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ƒ์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(MS-SQL, Oracle ๋“ฑ)์˜ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ฉฐ, ๋™์‹œ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ์‚ฌ์ด์—์„œ ๊ท ํ˜•์„ ์žก๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

Non-repeatable Read ๋ฐœ์ƒ ๊ฐ€๋Šฅ

READ COMMITTED ๋Š” ๋”ํ‹ฐ ๋ฆฌ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธด ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž A๊ฐ€ id=50์ธ ๋ฉค๋ฒ„์˜ ์ด๋ฆ„์„ MinKyu ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•œ๋‹ค.
  2. ์‚ฌ์šฉ์ž B๊ฐ€ ๊ฐ™์€ ์‹œ์ ์— SELECT ์ฟผ๋ฆฌ๋กœ ์ด๋ฆ„์„ ์กฐํšŒํ•˜๋ฉด, UNDO ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ ์ด์ „ ๊ฐ’์ธ MangKyu ๋ฅผ ๊ฒฐ๊ณผ๋กœ ๋ฐ›๋Š”๋‹ค.
  3. ์ดํ›„ ์‚ฌ์šฉ์ž A๊ฐ€ COMMIT์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  4. ์‚ฌ์šฉ์ž B๊ฐ€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด, ์ด๋ฒˆ์—” ๋ณ€๊ฒฝ ํ›„ ๊ฐ’์ธ MinKyu๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

์ด๋ ‡๋“ฏ, ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ˜๋ณต ์‹คํ–‰ํ–ˆ์Œ์—๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์„ Non-repeatable Read (๋ฐ˜๋ณต ๋ถˆ๊ฐ€ ์ฝ๊ธฐ) ๋ผ๊ณ  ํ•œ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ดํ›„ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ธ REPEATABLE READ ์ด์ƒ์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋Š”?

Non-repeatable Read ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋  ๋งŒํ•œ ์‚ฌ๋ก€๋ฅผ ํ˜„์‹ค์„ธ๊ณ„์—์„œ ๋– ์˜ฌ๋ ค ๋ณด์ž.

  1. A๋ผ๋Š” ์‚ฌ๋žŒ์ด ํŽธ์˜์ ์— 4/30 23:59์— ์ž…์žฅ
  2. 4์›”๊นŒ์ง€ 1,500์›์œผ๋กœ ์„ธ์ผํ•˜๋Š” ๊ณผ์ž๋ฅผ ์ง‘๊ณ  ์นด์šดํ„ฐ๋กœ ์ด๋™ (ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘)
  3. ์ด๋™ํ•˜๋˜ ์ค‘, 5/1 00:00 ์ด ๋˜์–ด ์„ธ์ผ์ด ์ข…๋ฃŒ๋จ (ํƒ€ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ๊ฐ€๊ฒฉ์ด 2,000์›์œผ๋กœ UPDATE ๋จ)
  4. A๋Š” 1,500์›์œผ๋กœ ์ธ์ง€ํ•˜๊ณ  ๊ตฌ์ž…ํ•˜๋ ค ํ–ˆ์ง€๋งŒ, 2,000์›์— ๊ตฌ์ž…ํ•˜๊ฒŒ ๋จ

์ด๋ ‡๋“ฏ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ฒ˜์Œ ํ™•์ธํ•œ ์ •๋ณด์™€ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์€, ์‚ฌ์šฉ์ž์˜ ์˜๋„์™€ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ค„์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„์ฆˆ๋‹ˆ์Šค ์ผ๊ด€์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“Œ 3. REPEATABLE READ

์ผ๋ฐ˜์ ์œผ๋กœ RDBMS์—์„œ๋Š” ๋ณ€๊ฒฝ ์ „ ๋ ˆ์ฝ”๋“œ๋ฅผ UNDO ๋กœ๊ทธ์— ๋ฐฑ์—…ํ•ด๋‘”๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ณ€๊ฒฝ ์ „/ํ›„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์กด์žฌํ•˜๊ฒŒ ๋˜๊ณ , ๋™์ผ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ํ•˜์—ฌ ์ด๋ฅผ MVCC ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

MVCC๋ž€?

MVCC๋Š” Multi-Version Concurrency Control์˜ ์ค€ ๋ง๋กœ, ๋‹ค์ค‘ ๋ฒ„์ „ ๋™์‹œ์„ฑ ์ œ์–ด๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋œ ๊ฒฝ์šฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ ๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ฐ๊ฐ์˜ ํŠธ๋žœ์žญ์…˜์€ ์ˆœ์ฐจ ์ฆ๊ฐ€ํ•˜๋Š” ๊ณ ์œ ํ•œ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ๋ฐฑ์—… ๋ ˆ์ฝ”๋“œ์—๋Š” ์–ด๋А ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ๋ฐฑ์—…๋˜์—ˆ๋Š”์ง€ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถˆํ•„์š”ํ•ด์ง„๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ์‹œ์ ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์“ฐ๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ์‚ญ์ œํ•œ๋‹ค.

ps. MVCC & REDO & UNDO์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„ ๋‹ค๋ฅธ ๊ธ€์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.

REPEATABLE READ ์ˆ˜์ค€์€ MVCC๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜์ง€๋งŒ, ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€(INSERT)๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

B ํŠธ๋žœ์žญ์…˜์ด ๋™์ž‘ํ•˜๋ฉด์„œ id๊ฐ€ 50์ด์ƒ์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•œ๋‹ค. ์ด ๋•Œ๋Š” 1๊ฑด์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์กฐํšŒ๋œ๋‹ค.

ํ˜„์žฌ BํŠธ๋žœ์žญ์…˜์˜ id๋Š” 10์ด๋‹ค. (T-ID=10)

A ํŠธ๋žœ์žญ์…˜์—์„œ id๊ฐ€ 50์ธ member์˜ name์„ MinKyu๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค.

ํ…Œ์ด๋ธ” ์ƒ์—์„œ๋Š” name์ด ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋‚˜, UNDO ๋กœ๊ทธ ๋‚ด์—๋Š” ์—…๋ฐ์ดํŠธ ์ด์ „ name์ด ๊ธฐ๋ก๋˜์–ด ์žˆ๋‹ค.

ํ˜„์žฌ AํŠธ๋žœ์žญ์…˜์˜ id๋Š” 12์ด๋‹ค. (T-ID=12)

A ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜์–ด, name์ด ์˜๊ตฌ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ์•„์ง B ํŠธ๋žœ์žญ์…˜์€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜๊ธฐ์—, ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋กœ id๊ฐ€ 50์ด์ƒ์ธ member๋ฅผ ์กฐํšŒํ•œ๋‹ค.

์ปค๋ฐ‹๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ…Œ์ด๋ธ” ์ƒ์—์„œ MinKyu๋ผ๋Š” name์„ ์กฐํšŒํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ์ด์ „์˜ name์ธ ManKyu๋ฅผ ์กฐํšŒํ•œ๋‹ค.

์–ด๋–ป๊ฒŒ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

์ด๋Š” B ํŠธ๋žœ์žญ์…˜์ด A ํŠธ๋žœ์žญ์…˜๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

REPEATABLE READ ์ˆ˜์ค€์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ id(๋ฒˆํ˜ธ)๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž์‹ ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋œ ํŠธ๋žœ์žญ์…˜์˜ ๋ฐ์ดํ„ฐ๋งŒ์„ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.

๋งŒ์•ฝ ์ง€๊ธˆ๊ณผ ๊ฐ™์ด ์ž์‹  ์ดํ›„๋กœ ์‹คํ–‰๋œ ํŠธ๋žœ์žญ์…˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”, UNDO ๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด B ํŠธ๋žœ์žญ์…˜์˜ id๊ฐ€ 10์ด๊ณ  A ํŠธ๋žœ์žญ์…˜์˜ id๊ฐ€ 12์ด๋ฏ€๋กœ, ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ(MinKyu)๋ฅผ ๋ฐ”๋กœ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ / UNDO ๋กœ๊ทธ์— ๊ธฐ๋ก๋œ ๋ฐ์ดํ„ฐ(ManKyu)๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์•„๋‹Œ, ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? A ํŠธ๋žœ์žญ์…˜์—์„œ id๊ฐ€ 51์ด๊ณ  name์ด Martin์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์ปค๋ฐ‹ํ•˜์˜€๋‹ค.

์ด๋•Œ B ํŠธ๋žœ์žญ์…˜์—์„œ id๊ฐ€ 50 ์ด์ƒ์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค. ํ˜„์žฌ ํ…Œ์ด๋ธ” ์ƒ์—๋Š” id๊ฐ€ 50 ์ด์ƒ์ธ ๋ ˆ์ฝ”๋“œ๊ฐ€ 2๊ฐœ์ด๋ฏ€๋กœ 2๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๊ณ  1๊ฑด๋งŒ ์กฐํšŒ๋œ๋‹ค.

์ด ๋˜ํ•œ ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํŠธ๋žœ์žญ์…˜ id๋ฅผ ํ†ตํ•ด์„œ, ์ž์‹  ์ดํ›„์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ์— ํŠธ๋žœ์žญ์…˜ id๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ, ์„ ํ›„ ๊ด€๊ณ„๋ฅผ ์ถ”์ ํ•˜์ง€ ๋ชป ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์ฒ˜๋Ÿผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ UNDO ๋กœ๊ทธ์—์„œ ์กฐํšŒํ•˜๋Š” ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.
๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ” ์ƒ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฝ๊ฒŒ ๋˜๊ณ , ๊ฒฐ๊ณผ๋กœ 2๊ฑด์˜ ๋ ˆ์ฝ”๋“œ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ Phantom Read(ํŒฌํ…€ ๋ฆฌ๋“œ)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

Phantom Read(ํŒฌํ…€ ๋ฆฌ๋“œ)๋ž€?

REPEATABLE READ ์ˆ˜์ค€์—์„œ๋Š” ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ์˜ ์ถ”๊ฐ€๊นŒ์ง€๋Š” ๋ง‰์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ SELECT๋กœ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ์ถ”๊ฐ€๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ Phantom Read๋ผ๊ณ  ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ MVCC ๋•๋ถ„์— ์ผ๋ฐ˜์ ์ธ ์กฐํšŒ์—์„œ Phantom Read๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—์„œ ํŒฌํ…€ ๋ฆฌ๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์„๊นŒ?

ํŒฌํ…€ ๋ฆฌ๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

๋ฝ(์ž ๊ธˆ)์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์— ํŒฌํ…€ ๋ฆฌ๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, MySQL์—๋Š” ํŠน์ˆ˜ํ•œ ๊ฐญ ๋ฝ ์ด๋ผ๋Š” ์žฅ์น˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ RDBMS๋ถ€ํ„ฐ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์™€ ๋™์ผํ•˜๊ฒŒ B ํŠธ๋žœ์žญ์…˜์—์„œ id๊ฐ€ 50์ด์ƒ์ธ ๋ฉค๋ฒ„๋ฅผ ์กฐํšŒํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฐจ์ด์ ์€ SELECT๊ฐ€ ์•„๋‹ˆ๋ผ, SELECT FOR UPDATE๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

SELECT FOR UPDATE?

SELECT FOR UPDATE ๊ตฌ๋ฌธ์€ ์กฐํšŒํ•˜๋Š” ํ–‰(row) ์— ๋Œ€ํ•ด ๋ฐฐํƒ€์  ๋ฝ(X-lock)์„ ๊ฑฐ๋Š” ๋น„๊ด€์  ์ž ๊ธˆ ๋ฐฉ์‹์ด๋‹ค.
์ด ๋ฝ์ด ๊ฑธ๋ฆฐ ๋ ˆ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์“ฐ๊ธฐ(INSERT, UPDATE, DELETE) ์ž‘์—…์€ ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ์ฝ๊ธฐ(SELECT) ์ž‘์—…์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋Ÿฌํ•œ ๋ฝ์€ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ ๋˜๋Š” ๋กค๋ฐฑ๋  ๋•Œ, ์ฆ‰ ์ข…๋ฃŒ๋  ๋•Œ ํ•ด์ œ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ A ํŠธ๋žœ์žญ์…˜์—์„œ id๊ฐ€ 51์ธ ๋ฐ์ดํ„ฐ๋ฅผ INSERTํ•œ๋‹ค. ํ˜„์žฌ ๋ฝ์€ id๊ฐ€ 50์ธ ๋ ˆ์ฝ”๋“œ์—๋งŒ ๊ฑธ๋ ค ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ •์ƒ์ ์œผ๋กœ ์‚ฝ์ž…์ด ๋œ๋‹ค.

์ดํ›„์— B ํŠธ๋žœ์žญ์…˜์—์„œ id๊ฐ€ 50 ์ด์ƒ์ธ member๋ฅผ ์กฐํšŒํ•˜๋ฉด, ์ด๋ฒˆ์—๋Š” 1๊ฑด์ด ์•„๋‹Œ 2๊ฑด์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.
๋ชจ๋ฅด๋Š” ์‚ฌ์ด์— ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ƒ๊ธฐ๊ฑฐ๋‚˜ ์‚ฌ๋ผ์ง€๋Š”, ํŒฌํ…€ ๋ฆฌ๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค.

์ด๋ฒˆ์—๋Š” ์™œ MVCC๋กœ ํŒฌํ…€ ๋ฆฌ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜์ง€ ๋ชป ํ–ˆ์„๊นŒ?

SELECT๊ฐ€ ์•„๋‹Œ SELECT FOR UPDATE, ์ฆ‰ ์ž ๊ธˆ ์žˆ๋Š” ์ฝ๊ธฐ๋กœ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” UNDO ๋กœ๊ทธ๊ฐ€ ์•„๋‹Œ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ”๋กœ ์กฐํšŒ๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž ๊ธˆ ์žˆ๋Š” ์ฝ๊ธฐ๋Š” ํ…Œ์ด๋ธ”์— ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ํ…Œ์ด๋ธ”์— ์ž ๊ธˆ์„ ๊ฑธ๊ณ  -> ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

UNDO ๋กœ๊ทธ์— ์ž ๊ธˆ์„ ๊ฑธ๊ณ  -> UNDO ๋กœ๊ทธ์—์„œ ์กฐํšŒํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?

๊ทธ๋Ÿด ์ˆ˜๋Š” ์—†๋‹ค. UNDO ๋กœ๊ทธ๋Š” Append Only ํ˜•ํƒœ๋กœ, ์ž ๊ธˆ ๊ธฐ๋Šฅ์ด ์—†์–ด ๋™์‹œ์„ฑ ์ œ์–ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋•Œ๋ฌธ์— ์ž ๊ธˆ ์žˆ๋Š” ์ฝ๊ธฐ(SELECT FOR UPDATE or SELECT FOR SHARE)๋กœ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”, UNDO ๋กœ๊ทธ๊ฐ€ ์•„๋‹Œ ํ…Œ์ด๋ธ”์—์„œ๋งŒ ์กฐํšŒ๋ฅผ ํ•˜๊ฒŒ ๋˜๊ณ  ์ด๋กœ ์ธํ•ด ํŒฌํ…€ ๋ฆฌ๋“œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.

MySQL Gap Lock

MySQL์—๋Š” ํŠน์ˆ˜ํ•œ ๊ฐญ ๋ฝ์ด๋ผ๋Š” ์žฅ์น˜๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋„ ํŒฌํ…€ ๋ฆฌ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

B ํŠธ๋žœ์žญ์…˜์—์„œ SELECT FOR UPDATE๋กœ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ์—, MySQL์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฝ์„ ๊ฑด๋‹ค.

  1. id๊ฐ€ 50์ธ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ๋ ˆ์ฝ”๋“œ ๋ฝ
  2. id๊ฐ€ 50๋ณด๋‹ค ํฐ ๋ฒ”์œ„๋Š” ๊ฐญ ๋ฝ์œผ๋กœ ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ

ps. ๋ ˆ์ฝ”๋“œ ๋ฝ, ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ, ๊ฐญ ๋ฝ ๋“ฑ์€ ์ถ”ํ›„ ๋‹ค๋ฅธ ๊ธ€์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ๋ ค๊ณ  ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ A ํŠธ๋žœ์žญ์…˜์ด id๊ฐ€ 51์ธ member๋ฅผ INSERT ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค๋ฉด, B ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค.
๋งŒ์•ฝ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๊ธธ์–ด์ง„๋‹ค๋ฉด, ๋ฝ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ MySQL์˜ REPEATABLE READ์—์„œ๋Š” ํŒฌํ…€ ๋ฆฌ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์œ ์ผํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

B ํŠธ๋žœ์žญ์…˜์—์„œ SELECT ๋ฌธ์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•œ๋‹ค. ์ด ๋•Œ๋Š” ๋ฝ์ด ๊ฑธ๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, A ํŠธ๋žœ์žญ์…˜์—์„œ INSERT๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ปค๋ฐ‹๊นŒ์ง€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋œ๋‹ค.

์ดํ›„ B ํŠธ๋žœ์žญ์…˜์—์„œ SELECT๊ฐ€ ์•„๋‹Œ SELECT FOR UPDATE ๋ฌธ์œผ๋กœ ์กฐํšŒ๋ฅผ ์‹œ๋„ํ•œ๋‹ค. ์ด ๋•Œ๋Š” UNDO ๋กœ๊ทธ๊ฐ€ ์•„๋‹Œ, ํ…Œ์ด๋ธ” ์ž์ฒด์—์„œ ์กฐํšŒ๋ฅผ ํ•˜๋ฏ€๋กœ 1๊ฑด์ด ์•„๋‹ˆ๋ผ 2๊ฑด์ด ์กฐํšŒ๋˜์–ด ํŒฌํ…€ ๋ฆฌ๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

MySQL ๊ธฐ์ค€ ํŒฌํ…€ ๋ฆฌ๋“œ ์ƒํ™ฉ ์ •๋ฆฌ

์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์˜จ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.(MySQL ๊ธฐ์ค€)

SELECT FOR UPDATE -> SELECT

  • ๊ฐญ ๋ฝ์œผ๋กœ ์ธํ•ด์„œ ํŒฌํ…€ ๋ฆฌ๋“œ ๋ฐœ์ƒ โŒ

SELECT FOR UPDATE -> SELECT FOR UPDATE

  • ๊ฐญ ๋ฝ์œผ๋กœ ์ธํ•ด์„œ ํŒฌํ…€ ๋ฆฌ๋“œ ๋ฐœ์ƒ โŒ

SELECT -> SELECT

  • MVCC๋กœ ์ธํ•ด์„œ ํŒฌํ…€ ๋ฆฌ๋“œ ๋ฐœ์ƒ โŒ

SELECT -> SELECT FOR UPDATE

  • MVCC ๋™์ž‘ ๋ถˆ๊ฐ€, ์œ ์ผํ•˜๊ฒŒ ํŒฌํ…€ ๋ฆฌ๋“œ ๋ฐœ์ƒ โญ•๏ธ

๐Ÿ“Œ 4. SERIALIZABLE

๊ธ€ ์ดˆ๋ฐ˜๋ถ€์—์„œ, ๊ฒฉ๋ฆฌ์„ฑ์ด ๋‚ฎ์€ ์ˆœ์œผ๋กœ ์ •๋ฆฌ๋ฅผ ํ•œ๋‹ค๊ณ  ํ•˜์˜€๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์ด๋ฒˆ์— ์ •๋ฆฌํ•  SERIALIZABLE์€ ๊ฒฉ๋ฆฌ์„ฑ์ด ๊ฐ€์žฅ ๋†’๊ณ  / ๋™์‹œ์„ฑ์ด ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

SERIALIZABLE?

์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚จ๋‹ค๋Š” ๋œป์ด๋‹ค. ํ•ด๋‹น ์ˆ˜์ค€์—์„œ๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์—์„œ ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ์— ์ ˆ๋Œ€๋กœ ๋™์‹œ ์ ‘๊ทผํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

๋•Œ๋ฌธ์— ์œ„์—์„œ ์–ธ๊ธ‰ํ•˜์˜€๋˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ๊ณผ ๊ด€๋ จํ•œ ๋ฌธ์ œ๋“ค์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ ๋Œ€์‹ ์— ๋™์‹œ์„ฑ์ด ๋งค์šฐ ๋–จ์–ด์ง€๊ณ , ์ด๋Š” ์ฒ˜๋ฆฌ ์†๋„ ์ €ํ•˜์— ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ ๋œ๋‹ค.

SELECT ๋ฌธ์—๋„ ๋ฝ์„?

์œ„ REPEATABLE READ ์ˆ˜์ค€์„ ์„ค๋ช…ํ•˜๋ฉด์„œ, SELECT FOR UPDATE ๋˜๋Š” SELECT FOR SHARE ๋ฌธ์—์„œ๋Š” ๋ฝ์„ ๊ฑธ์ง€๋งŒ, ์ˆœ์ˆ˜ํ•œ SELECT ๋ฌธ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Œ์„ ์–ธ๊ธ‰ํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ SERIALIZABLE ์ˆ˜์ค€์—์„œ๋Š”,
์ˆœ์ˆ˜ํ•œ SELECT ์ž‘์—…์—์„œ๋„ ๋Œ€์ƒ ๋ ˆ์ฝ”๋“œ์— ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์„ย ์ฝ๊ธฐ ์ž ๊ธˆ(๊ณต์œ ๋ฝ, Shared Lock)์œผ๋กœ ๊ฑด๋‹ค.

๋”ฐ๋ผ์„œ ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ SELECT๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ๋Œ€์ƒ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ ˆ๋Œ€ ์ถ”๊ฐ€/์ˆ˜์ •/์‚ญ์ œํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ๋งŽ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.


profile
์•ˆ๋…•ํ•˜์„ธ์š”. ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž, ํ•œ์ƒํ˜ธ์ž…๋‹ˆ๋‹ค.

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