๐ŸŒฑ Transaction lsolation Level! (feat. MySQL)

sh_awtylol4ยท2022๋…„ 10์›” 12์ผ
0

๐ŸŒฑ Today I Learn

๋ชฉ๋ก ๋ณด๊ธฐ
15/16
post-thumbnail

Transaction์€ ์ด๋ฏธ ๋ธ”๋กœ๊น… ํ•ด๋†จ์œผ๋‹ˆ ๋ฐ”๋กœ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์œผ๋กœ ๋„˜์–ด๊ฐ€๋ณด์ž!

๐Ÿค” MySQL์˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€

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

๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด 4๊ฐ€์ง€๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • READ UNCOMMITTED (์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ์ฝ๊ธฐ)
  • READ COMMITTED (์ปค๋ฐ‹๋œ ์ฝ๊ธฐ)
  • REPEATABLE READ (๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ์ฝ๊ธฐ)
  • SERIALIZABLE (์ง๋ ฌํ™” ๊ฐ€๋Šฅ)

์ˆœ์„œ๋Œ€๋กœ READ UNCOMMITTED์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๊ฐ€์žฅ ๋‚ฎ๊ณ  SERIALIZABLE์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๊ฐ€์žฅ ๋†’์Šต๋‹ˆ๋‹ค. ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋†’์•„์งˆ์ˆ˜๋ก MySQL ์„œ๋ฒ„์˜ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋งŽ์ด ๋–จ์–ด์งˆ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์€๋ฐ, ์‚ฌ์‹ค ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

SERIALIZABLE ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ผ๋ฉด ํฌ๊ฒŒ ์„ฑ๋Šฅ์˜ ๊ฐœ์„ ์ด๋‚˜ ์ €ํ•˜๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"DIRTY READ"๋ผ๊ณ ๋„ ํ•˜๋Š” "READ UNCOMMITTED"๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , SERIALIZABLE ์—ญ์‹œ ๋™์‹œ์„ฑ์ด ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ํ‘œ๋Š” ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ์ž…๋‹ˆ๋‹ค.

SQL-92 ๋˜๋Š” SQL-99 ํ‘œ์ค€์— ๋”ฐ๋ฅด๋ฉด REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” PHANTOM READ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ InnoDB์—์„œ๋Š” ๋…ํŠนํ•œ ํŠน์„ฑ ๋•Œ๋ฌธ์— REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋„ PHANTOM READ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์˜ค๋ผํด์˜ ๊ฒฝ์šฐ ์ฃผ๋กœ READ COMMITTED์„, MySQL์˜ ๊ฒฝ์šฐ REPEATABLE READ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘Ž READ UNCOMMITTED

๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๊ฐ ํŠธ๋žœ์žญ์…˜์—์„œ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด COMMIT์ด๋‚˜ ROLLBACK ์—ฌ๋ถ€์— ์ƒ๊ด€ ์—†์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณด์—ฌ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์œ„ ๊ทธ๋ฆผ์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์‚ฌ์šฉ์ž B๊ฐ€ ์‹คํ–‰ํ•˜๋Š” SELECT ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์— ์–ด๋– ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

READ UNCOMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๊ฐ ํŠธ๋žœ์žญ์…˜์—์„œ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด COMMIT ์ด๋‚˜ ROLLBACK ์—ฌ๋ถ€์— ์ƒ๊ด€ ์—†์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณด์—ฌ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž A๊ฐ€ INSERTํ•œ ๋‚ด์šฉ์ด ์ปค๋ฐ‹์ด ๋˜์ง€ ์•Š์•˜์Œ์—๋„ ์‚ฌ์šฉ์ž B๋Š” ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ์—ฌ๊ธฐ์„œ A๊ฐ€ INSERT ๋‚ด์šฉ์„ ๋กค๋ฐฑํ•ด๋ฒ„๋ ค๋„ B๋Š” ๋‹ฌ๋ผ์ง„ ๋‚ด์šฉ์ด ์–ด๋–ค ๊ฒƒ์ธ์ง€ ์•Œ์ง€ ๋ชปํ•œ ์ƒํƒœ๋กœ ์ž‘์—…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ์–ด๋– ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ํ˜„์ƒ์„ ๋”ํ‹ฐ ๋ฆฌ๋“œ(Dirty Read)๋ผ ํ•˜๊ณ , ๋”ํ‹ฐ ๋ฆฌ๋“œ๊ฐ€ ํ—ˆ์šฉ๋„๋‹ˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด READ UNCOMMITTED ์ž…๋‹ˆ๋‹ค. ๋”ํ‹ฐ ๋ฆฌ๋“œ ํ˜„์ƒ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๋‹ค๊ฐ€ ์‚ฌ๋ผ์กŒ๋‹ค ํ•˜๋Š” ํ˜„์ƒ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž์™€ ์‚ฌ์šฉ์ž๋ฅผ ํ˜ผ๋ž€ ์Šค๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋”ํ‹ฐ ๋ฆฌ๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋Š” READ UNCOMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ RDBMS ํ‘œ์ค€์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์œผ๋กœ ์ธ์ •ํ•˜์ง€ ์•Š์„ ์ •๋„๋กœ ์ •ํ•ฉ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ๋งŽ์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ MySQL์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ตœ์†Œ READ COMMITTED ์ด์ƒ์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” READ COMMITTED

READ COMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ์˜ค๋ผํด DBMS์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ์˜จ๋ผ์ธ ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์„ ํƒ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ์ด ๋ ˆ๋ฒจ์—์„œ๋Š” ์œ„ READ UNCOMMITTED ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋”ํ‹ฐ ๋ฆฌ๋“œ(Dirty Read)์™€ ๊ฐ™์€ ํ˜„์ƒ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋– ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ COMMIT์ด ์™„๋ฃŒ๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์–ธ๋‘ ๋ ˆ์ฝ”๋“œ๋Š” InnoDB์˜ ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ” ์ŠคํŽ˜์ด์Šค์˜ ์–ธ๋‘ ์˜์—ญ์— ๊ธฐ๋ก์ด ๋˜๋Š”๋ฐ, ์–ธ๋‘ ๋ ˆ์ฝ”๋“œ๋Š” ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋ฟ ์•„๋‹ˆ๋ผ ํŠธ๋žœ์žญ์…˜์˜ ROLLBACK์— ๋Œ€ํ•œ ๋ณต๊ตฌ์—๋„ ์‚ฌ์šฉ์ด ๋ฉ๋‹ˆ๋‹ค.

โ˜… ์–ธ๋‘(Undo) ๋กœ๊ทธ โ˜…
์–ธ๋‘ ์˜์—ญ์€ UPDATE ๋ฌธ์žฅ์ด๋‚˜ DELETE์™€ ๊ฐ™์€ ๋ฌธ์žฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „์˜ ๋ฐ์ดํ„ฐ(์ด์ „ ๋ฐ์ดํ„ฐ)๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

MySQL > UPDATE member SET name = '์ด์ฃผํ˜„' WHERE member_id = '5';

์œ„ ๋ฌธ์žฅ์ด ์‹คํ–‰๋˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์•„๋„ ์‹ค์ œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๋‚ด์šฉ์€ "์ด์ฃผํ˜„"์œผ๋กœ ๋ณ€๊ฒฝ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ๋˜๊ธฐ ์ „์˜ ๊ฐ’์ด "ํ™๊ธธ๋™"์ด๋ผ๋ฉด ์–ธ๋‘ ์˜์—ญ์—๋Š” "ํ™๊ธธ๋™"์ด๋ผ๋Š” ๊ฐ’์ด ๋ฐฑ์—…์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ์ปค๋ฐ‹ํ•˜๊ฒŒ ๋˜๋ฉด ํ˜„์žฌ ์ƒํƒœ(์ด์ฃผํ˜„)๊ฐ€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๊ณ , ๋กค๋ฐฑํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์–ธ๋‘ ์˜์—ญ์˜ ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ(ํ™๊ธธ๋™)๋ฅผ ๋‹ค์‹œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋กœ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์–ธ๋‘์˜ ๋ฐ์ดํ„ฐ๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์šฉ๋„๋กœ ์‚ฌ์šฉ์ด ๋ฉ๋‹ˆ๋‹ค.

1) ํŠธ๋žœ์žญ์…˜์˜ ๋กค๋ฐฑ ๋Œ€๋น„์šฉ

2) ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋†’์€ ๋™์‹œ์„ฑ์„ ์ œ๊ณต

๐Ÿšซ "NON-REPEATABLE READ" - READ COMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

์‚ฌ์šฉ์ž B๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  'Choi OO'์„ ์กฐํšŒํ•˜๋ฉด ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ์ดํ›„์— ์‚ฌ์šฉ์ž A๊ฐ€ 2001์˜ NAME์„ 'Choi OO'์œผ๋กœ ์ˆ˜์ •ํ•˜๊ณ  ์ปค๋ฐ‹ํ•œ ํ›„ ์‚ฌ์šฉ์ž B๊ฐ€ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋กœ ์กฐํšŒํ•˜๋ฉด ์ด๋ฒˆ์—๋Š” ๊ฒฐ๊ณผ๊ฐ€ 1๊ฑด ์กฐํšŒ๋œ๋‹ค. ์ด๋Š” ๋ณ„๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์—†์–ด๋ณด์ด๋‚˜ ์‚ฌ์šฉ์ž B๊ฐ€ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜๋‚ด์—์„œ ๋™์ผํ•œ SELECT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” "REPEATABLE READ" ์ •ํ•ฉ์„ฑ์— ์–ด๊ธ‹๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ž…๊ธˆ๊ณผ ์ถœ๊ธˆ ์ฒ˜๋ฆฌ๊ฐ€ ๊ณ„์† ์ง„ํ–‰๋˜๊ณ  ์žˆ์„ ๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์˜ค๋Š˜ ์ž…๊ธˆ๋œ ๊ธˆ์•ก์˜ ์ดํ•ฉ์„ ์กฐํšŒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. "REPEATABLE READ"๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” SELECT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋–„๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ์‚ฌ์šฉ์ค‘์ธ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” SQL ๋ฌธ์žฅ์ด ์–ด๋– ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๋Š”์ง€ ์ •ํ™•ํžˆ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ฐ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ˜ REPEATABLE READ

REPEATABLE READ๋Š” MySQL์˜ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” READ COMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•˜๋Š” "NON-REPEATABLE READ" ๋ถ€์ •ํ•ฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ํŠธ๋žœ์žญ์…˜์ด ROLLBACK๋  ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€๋น„ํ•ด ๋ณ€๊ฒฝ๋˜ ์ „ ๋ ˆ์ฝ”๋“œ๋ฅผ ์–ธ๋‘(Undo) ์˜์—ญ์— ๋ฐฑ์—…ํ•ด๋‘๊ณ  ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ๋ฐฉ์‹์„ MVCC(Multi Version Concurrency Control)์ด๋ผ๊ณ  ํ•œ๋‹ค.

REPEATABLE READ๋Š” ์ด MVCC๋ฅผ ์œ„ํ•ด ์–ธ๋‘ ์˜์—ญ์— ๋ฐฑ์—…๋œ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

READ COMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ๋˜ํ•œ MVCC๋ฅผ ์ด์šฉํ•ด COMMIT๋˜๊ธฐ ์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋‚˜ REPEATABLE READ์™€ READ COMMITTED์˜ ์ฐจ์ด๋Š” ์–ธ๋‘ ์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „ ๊ฐ€์šด๋ฐ ๋ช‡ ๋ฒˆ์งธ ์ด์ „์˜ ๋ฒ„์ „๊นŒ์ง€ ์ฐพ์•„ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š”์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค.

MVCC(Multi Version Concurrency Control) - ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ผ๊ด€๋œ ์ฝ๊ธฐ๋ฅผ ์ œ๊ณต

MVCC๋Š” ๋‹ค์ค‘ ๋ฒ„์ „ ๋ณ‘ํ–‰์ˆ˜ํ–‰ ์ œ์–ด์˜ ์•ฝ์ž๋กœ DBMS์—์„œ๋Š” ์“ฐ๊ธฐ(Write) ์„ธ์…˜์ด ์ฝ๊ธฐ(Read) ์„ธ์…˜์„ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๊ณ , ์ฝ๊ธฐ ์„ธ์…˜์ด ์“ฐ๊ธฐ ์„ธ์…˜์„ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๊ฒŒ ์„œ๋กœ ๋‹ค๋ฅธ ์„ธ์…˜์ด ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ ๊ฐ ์„ธ์…˜๋งˆ๋‹ค ์Šค๋ƒ…์ƒท ์ด๋ฏธ์ง€๋ฅผ ๋ณด์žฅํ•ด์ฃผ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜
์ด๋Š” RDBMS์—์„œ ๋™์‹œ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ธฐ์ˆ ๋กœ, ์†Œ์ˆ˜์˜ ์ „์‚ฐ์‹ค ์šด์˜์ž๋“ค์ด ์„œ๋ฒ„ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์‹œ์ ˆ์—๋Š” MVCC๊ฐ€ ์„ ํƒ์‚ฌํ•ญ์ด์—ˆ์ง€๋งŒ ์ธํ„ฐ๋„ท์ด ๋ณดํŽธํ™”๋˜๊ณ  ์˜จ๋ผ์ธ์œผ๋กœ ์—…๋ฌด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹œ๋Œ€์—์„œ๋Š” DBMS๋ฅผ ์„ ํƒํ•˜๋Š”๋ฐ ์žˆ์–ด MVCC๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ๊ฐ€ ๋๋‹ค.

์ถœ์ฒ˜ : ๋ฐ์ดํ„ฐ๋„ท(http://www.datanet.co.kr)

๋ชจ๋“  InnoDB์˜ ํŠธ๋žœ์žญ์…˜์€ ๊ณ ์œ ํ•œ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ(์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ’)๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์–ธ๋‘ ์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์—๋Š” ๋ณ€๊ฒฝ์„ ๋ฐœ์ƒ์‹œํ‚จ ํŠธ๋žœ์žญ์…˜์˜ ๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ๋‘ ์˜์—ญ์˜ ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ๋Š” InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ์‹œ์ ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” MVCC๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜ ๊ฐ€์šด๋ฐ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ณด๋‹ค ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๊ฐ€ ์•ž์„  ์–ธ๋‘ ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๋Š” ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” ์–ธ๋‘ ์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š”๊ฒƒ์œผ๋กœ ํ‘œํ˜„ํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ฐฑ์—…์ด ํ•˜๋‚˜ ์ด์ƒ ์–ผ๋งˆ๋“ ์ง€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ BEGIN ๋ช…๋ น์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ ํ›„ ์žฅ์‹œ๊ฐ„๋™์•ˆ ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•˜์ง€ ์•Š์œผ๋ฉด ์–ธ๋‘ ์˜์—ญ์ด ๋ฐฑ์—…๋œ ๋ฐ์ดํ„ฐ๋กœ ๋ฌดํ•œ์ • ์ปค์งˆ ์ˆ˜ ์žˆ๊ณ , ์ด๋ ‡๊ฒŒ ์–ธ๋‘ ์˜์—ญ์— ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก MySQL ์„œ๋ฒ„์˜ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿšซ "PHANTOM READ(PHANTOM ROW)" - REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

REPEATABLE ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ€์ •ํ•ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ ์‚ฌ์šฉ์ž A๊ฐ€ employees ํ…Œ์ด๋ธ”์— INSERT๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋„์ค‘์— ์‚ฌ์šฉ์ž B๊ฐ€ SELECT .. FOR UPDATE ์ฟผ๋ฆฌ๋กœ employees ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ–ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

์œ„ ๊ทธ๋ฆผ์—์„œ ์‚ฌ์šฉ์ž B๋Š” ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ํ›„ SELECT ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ „ REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ์˜ ์„ค๋ช…์ฒ˜๋Ÿผ ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์œ„ ๊ทธ๋ฆผ์—์„œ ์‚ฌ์šฉ์ž B๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๋‘ ๋ฒˆ์˜ SELECT .. FOR UPDATE ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋Š” ์„œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ˆ˜ํ–‰ํ•œ ๋ณ€๊ฒฝ ์ž‘์—…์— ์˜ํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ณด์˜€๋‹ค๊ฐ€ ์•ˆ๋ณด์˜€๋‹ค๊ฐ€ ํ•˜๋Š” ํ˜„์ƒ์„ PHANTOM READ(PHANTOM ROW)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

SELECT .. FOR UPDATE ์ฟผ๋ฆฌ๋Š” SELECTํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์— ์“ฐ๊ธฐ ์ž ๊ธˆ์„ ๊ฑธ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์–ธ๋‘ ๋ ˆ์ฝ”๋“œ์—๋Š” ์ž ๊ธˆ์„ ๊ฑธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋Š” ์–ธ๋‘ ์˜์—ญ์˜ ๋ณ€๊ฒฝ ์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฌ ๋ ˆ์ฝ”๋“œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ž SERIALIZABLE

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ฉด์„œ ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ๋„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€๋ณด๋‹ค ํ˜„์ €ํžˆ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด SERIALIZABLE๋กœ ์„ค์ •๋˜๋ฉด ์ฝ๊ธฐ ์ž‘์—…๋„ ๊ณต์œ  ์ž ๊ธˆ(์ฝ๊ธฐ ์ž ๊ธˆ)์„ ํš๋“ํ•ด์•ผ ํ•˜๋ฉฐ, ๋™์‹œ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ๊ทธ๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฝ๊ณ  ์“ฐ๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ์ ˆ๋Œ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

SERIALIZABLE ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ์ผ๋ฐ˜์ ์ธ DBMS์—์„œ ๋ฐœ์ƒํ•˜๋Š” "PHANTOM READ" ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ, ์œ„์—์„œ ์„ค๋ช…๋“œ๋ ธ๋“ฏ์ด InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ๋Š” REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋„ "PHANTOM READ"๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด SERIALIZABLE ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•  ํ•„์š”์„ฑ์€ ์—†์–ด๋ณด์ž…๋‹ˆ๋‹ค.

โœ๏ธ ์ •๋ฆฌ

๐Ÿฅ‡ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

  • READ UNCOMMITTED: ํŠธ๋žœ์žญ์…˜๋‚ด์—์„œ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ
  • READ COMMITTED: ํŠธ๋žœ์žญ์…˜๋‚ด์—์„œ ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ฝ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉ
  • REPEATABLE READ: ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ํ•œ ๋ฒˆ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์กฐํšŒํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผ
  • SERIALIZABLE: ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์œผ๋กœ ์™„๋ฒฝํ•œ ์ฝ๊ธฐ ์ผ๊ด€์„ฑ ๋ชจ๋“œ ์ œ๊ณต

๐Ÿ‘ฟ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

  • DIRTY READ: ์–ด๋– ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ํ˜„์ƒ
  • NON-REPEATABLE READ: ๋™์ผํ•œ SELECT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” "REPEATABLE READ" ์ •ํ•ฉ์„ฑ์— ์–ด๊ธ‹๋‚˜๋Š” ํ˜„์ƒ
  • PHANTOM READ: ํ•œ ํŠธ๋žœ์žญ์…˜๋‚ด์—์„œ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ์ˆ˜ํ–‰ํ–ˆ๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ์กด์žฌํ•˜์ง€ ์•Š๋˜ ์œ ๋ น(Phantom) ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜„์ƒ

์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ๐Ÿ‘

profile
ํฌ๊ธฐํ•˜๋Š” ๊ทธ ์ˆœ๊ฐ„์ด ๋ฐ”๋กœ ์‹œํ•ฉ์ข…๋ฃŒ์˜ˆ์š”...

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