๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
CS/Database

[MySQL] - ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level)

by ์ฃผ๋ฐœ2 2021. 9. 5.
๋ฐ˜์‘ํ˜•

๐Ÿ“Ž  ๊ธ€๋˜ 6๊ธฐ ํฌ์ŠคํŒ…

1. ๋ฏธ์น˜๋„๋ก ๋”์› ๋˜ 7์›”์˜ ํšŒ๊ณ 

 

2. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•  ๋•Œ์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ

 

3. Spring AOP - (1) ํ”„๋ก์‹œ ํŒจํ„ด, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด

 

4. [MySQL] - ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level)

 

5. Spring AOP - (2) AOP ๊ฐœ๋… ๋ฐ ์‹ค์Šต

 

6. ์ธํ…”๋ฆฌ์ œ์ด(IntelliJ) - ๋””๋ฒ„๊น…(Debugging) ํ•˜๊ธฐ

 

7. [Java, ๋””์ž์ธํŒจํ„ด] - ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด(Singleton Pattern)

 

8. ์›”๊ฐ„ ์ฝ”๋“œ๋ฆฌ๋ทฐ Ver_0.1: ์ปค๋ฆฌ์–ด ์„ฑ์žฅ CODE ์„ธ๋ฏธ๋‚˜ ์ •๋ฆฌ

 

9. ํฌ์ŠคํŠธ๋งจ(API ํ…Œ์ŠคํŠธ) ํ™œ์šฉํ•˜๊ธฐ

 

10. ๋œป๊นŠ์€ 2021๋…„ ํšŒ๊ณ 

 


๐Ÿ“Ž  MySQL ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level)

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด๋ฒˆ ์‹œ๊ฐ„์— ์ •๋ฆฌํ•  ๋‚ด์šฉ์€ MySQL์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation level)์— ๊ด€ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์ตœ๊ทผ ๋ช‡๋ช‡ ๋ฉด์ ‘์„ ์ง„ํ–‰ํ•˜๋ฉฐ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€, ๋™์‹œ์„ฑ ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ์งˆ๋ฌธ์„ ๋ฐ›์€์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์—์„œ๋Š” ํ‰์†Œ์— ๋”ฐ๋กœ ๊ณ ๋ฏผ์„ ํ•ด๊ฑฐ๋‚˜ ๊ณต๋ถ€ํ•œ ์ ์ด ์—†์—ˆ๊ธฐ์—, ์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โ€ป ํ˜น์‹œ๋‚˜ ํฌ์ŠคํŒ…์— ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ด์— ๋Œ€ํ•ด์„œ ๋ง์”€ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. :) 

 

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ํฌ์ปค์‹ฑ์„ ๋‘์—ˆ๊ธฐ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์— ๊ด€ํ•œ ์„ค๋ช…์€ ๊ฐ„๋žตํ•˜๊ฒŒ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

1) ํŠธ๋žœ์žญ์…˜(Transaction)


ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์€ ๊ผญ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€๊ฒฝ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์กฐํ•ฉ๋์„๋•Œ๋งŒ ์˜๋ฏธ์žˆ๋Š” ๊ฐœ๋…์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์€ ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ์…‹ ์ž์ฒด๊ฐ€ 100% ์ ์šฉ๋˜๊ฑฐ๋‚˜(COMMIT) ๋˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•จ(ROLLBACK)์„ ๋ณด์žฅํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ํŠธ๋žœ์žญ์…˜์€ ACID๋ผ ํ•˜๋Š” ์›์ž์„ฑ(Atomicity), ์ผ๊ด€์„ฑ(Consistency), ๊ฒฉ๋ฆฌ์„ฑ(Isolation), ์ง€์†์„ฑ(Durability)์„ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ACID์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์›์ž์„ฑ(Atomicity): ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‹คํ–‰ํ•œ ์ž‘์—…๋“ค์€ ๋งˆ์น˜ ํ•˜๋‚˜์˜ ์ž‘์—…์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ๋ชจ๋‘ ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๊ด€์„ฑ(Consistency): ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์€ ์ผ๊ด€์„ฑ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ •ํ•œ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด์„ ํ•ญ์ƒ ๋งŒ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฉ๋ฆฌ์„ฑ(Isolation): ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ํŠธ๋žœ์žญ์…˜๋“ค์ด ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋™์‹œ์— ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฉ๋ฆฌ์„ฑ์€ ๋™์‹œ์„ฑ๊ณผ ๊ด€๋ จ๋œ ์„ฑ๋Šฅ ์ด์Šˆ๋กœ ์ธํ•ด ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€์†์„ฑ(Durability): ํŠธ๋žœ์žญ์…˜์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚ด๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๊ธฐ๋ก๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ฐ„์— ์‹œ์Šคํ…œ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ๊ทธ ๋“ฑ์„ ์‚ฌ์šฉํ•ด์„œ ์„ฑ๊ณตํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์šฉ์„ ๋ณต๊ตฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์€ ์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ์ง€์†์„ฑ์„ ๋ณด์žฅํ•˜๋Š”๋ฐ ๋ฌธ์ œ๋Š” ๊ฒฉ๋ฆฌ์„ฑ์ž…๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜๊ฐ„์— ๊ฒฉ๋ฆฌ์„ฑ์„ ์™„๋ฒฝํžˆ ๋ณด์žฅํ•˜๋ ค๋ฉด ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ๊ฑฐ์˜ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋‚˜๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋กœ ์ธํ•ด ANSI ํ‘œ์ค€์€ ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ 4๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

2) MySQL์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€


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

 

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

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

์ˆœ์„œ๋Œ€๋กœ READ UNCOMMITTED์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๊ฐ€์žฅ ๋‚ฎ๊ณ  SERIALIZABLE์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๊ฐ€์žฅ ๋†’์Šต๋‹ˆ๋‹ค.

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

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

 

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

 

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

๊ฒฉ๋ฆฌ ์ˆ˜์ค€ DIRTY READ NON-REPEATABLE READ PHANTOM READ
READ UNCOMMITTED O O O
READ COMMITTED   O O
REPEATABLE READ     O(InnoDB๋Š” ๋ฐœ์ƒ X)
SERIALIZABLE      

์œ„(READ UNCOMMITTED)์ชฝ์œผ๋กœ ๊ฐˆ ์ˆ˜๋ก ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋‚ฎ์•„์ง€๋Š”๋ฐ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋‚ฎ์„์ˆ˜๋ก ๋” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

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

 

SHOW VARIABLES LIKE 'tx_isolation';

MySQL

์ผ๋ฐ˜์ ์ธ ์˜จ๋ผ์ธ ์„œ๋น„์Šค ์šฉ๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” READ COMMITTED์™€ REPEATABLE READ ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ๋“ค์€ ๋ชจ๋‘ AUTO_COMMIT = OFF์ธ ์ƒํƒœ๋กœ ๊ฐ€์ •ํ•˜๊ณ  ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

2-1) READ UNCOMMITTED


READ UNCOMMITTED

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

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

 

์œ„ ๊ทธ๋ฆผ์—์„œ ์‚ฌ์šฉ์ž A๋Š” emp_no = 50000, first_name = 'JuBal'์ธ ์ƒˆ๋กœ์šด ์‚ฌ์›์„ INSERTํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž B๋Š” ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ์ปค๋ฐ‹ํ•˜๊ธฐ๋„ ์ „์— emp_no = 50000์ธ ์‚ฌ์›์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž B๋Š” ์‚ฌ์šฉ์ž A๊ฐ€ INSERTํ•œ ์‚ฌ์›์˜ ์ •๋ณด๋ฅผ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ๋„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ๋งŒ์•ฝ ์‚ฌ์šฉ์ž A๊ฐ€ ์ž‘์—… ๋„์ค‘ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ INSERT๋œ ๋‚ด์šฉ์„ ๋กค๋ฐฑํ•ด๋ฒ„๋ฆฐ๋‹ค ํ•˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž B๋Š” JuBal์ด ์ •์ƒ์ ์ธ ์‚ฌ์›์ด๋ผ ํŒ๋‹จํ•˜๊ณ  ๊ณ„์†ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์–ด๋– ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ฒ˜๋ฆฌํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ํ˜„์ƒ์„

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

 

 

 

READ UNCOMMITTED ํ…Œ์ŠคํŠธ


1) ๋จผ์ € ๋‘ ๊ฐœ์˜ Session์„ ์ค€๋น„ํ•˜๊ณ  ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๋ชจ๋‘ 'READ UNCOMMITTED'๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

// ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์กฐํšŒ
show variables like 'tx_isolation';

// ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์ˆ˜์ •
set tx_isolation = 'READ-UNCOMMITTED'

 

 

2) ํ•˜๋‚˜์˜ Session์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘(BEGIN)ํ•˜๊ณ  INSERT๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

3) ๋‹ค๋ฅธ Session์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ SELECT ํ•ฉ๋‹ˆ๋‹ค.

 

 

4) INSERTํ–ˆ๋˜ Session์—์„œ ROLLBACK์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

5) ๋‹ค๋ฅธ Session์—์„œ ๋‹ค์‹œ ๋ฐ์ดํ„ฐ๋ฅผ SELECT ํ•ฉ๋‹ˆ๋‹ค.

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

 

 

 

2-2) READ COMMITTED


READ COMMITTED

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

 

์œ„ ๊ทธ๋ฆผ์„ ํ†ตํ•ด READ COMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ ์‚ฌ์šฉ์ž A๊ฐ€ ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์ด ์‚ฌ์šฉ์ž B์—๊ฒŒ ์–ด๋–ป๊ฒŒ ์กฐํšŒ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž A๋Š” emp_no = 50000์ธ ์‚ฌ์›์˜ first_name์„ "JuBal"์—์„œ "Toto"๋กœ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ, ์ด ๋•Œ ์ƒˆ๋กœ์šด ๊ฐ’์ธ "Toto"๋Š” employees ํ…Œ์ด๋ธ”์— ์ฆ‰์‹œ ๊ธฐ๋ก๋˜๊ณ  ์ด์ „ ๊ฐ’์ธ "JuBal"์€ Undo ์˜์—ญ์œผ๋กœ ๋ฐฑ์—…์ด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž A๊ฐ€ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์ปค๋ฐ‹ํ•˜๊ธฐ์ „์— ์‚ฌ์šฉ์ž B๊ฐ€ emp_no = 50000์ธ ์‚ฌ์›์„ ์กฐํšŒํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ’์€ "Toto"๊ฐ€ ์•„๋‹Œ ์ด์ „ ๊ฐ’์ธ "JuBal"์ด ์กฐํšŒ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž B์˜ SELECT ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋Š” employees ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ UNDO ์˜์—ญ์˜ ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. 

READ COMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์ด ์ปค๋ฐ‹๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ทธ๋Ÿฌํ•œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์กฐํšŒํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

 

์ตœ์ข…์ ์œผ๋กœ ์‚ฌ์šฉ์ž A๊ฐ€ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ์ปค๋ฐ‹ํ•˜๋ฉด ๊ทธ๋•Œ๋ถ€ํ„ฐ๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ๋„ ๋ฐฑ์—…๋œ UNDO์˜์—ญ์˜ ๋ฐ์ดํ„ฐ์ธ "JuBal"์ด ์•„๋‹Œ ์ƒˆ๋กญ๊ฒŒ ๋ณ€๊ฒฝ๋œ "Toto"๋ผ๋Š” ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

 

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

 

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

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

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

 

 

READ COMMITTED ํ…Œ์ŠคํŠธ


1) ๋จผ์ € ๋‘ ๊ฐœ์˜ Session์„ ์ค€๋น„ํ•˜๊ณ  ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๋ชจ๋‘ 'READ COMMITTED'๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

 

 

2) ๊ธฐ์กด์— emp_no = 50000์ธ ์‚ฌ์›์˜ ์ด๋ฆ„์€ 'JuBal'์ž…๋‹ˆ๋‹ค.

 

 

3) ํ•˜๋‚˜์˜ Session์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ Update ํ•ฉ๋‹ˆ๋‹ค.

 

 

4) ๋‹ค๋ฅธ Session์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

์กฐํšŒํ•˜๋ฉด ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ์ธ 'JuBal'์ด ์กฐํšŒ๊ฐ€ ๋˜๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์œ„ SELECT ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋Š” employees ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ UNDO ์˜์—ญ์˜ ๋ฐฑ์—…๋œ ๋ ˆ์ฝ”๋“œ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

์œ„์—์„œ ๋ง์”€๋“œ๋ฆฐ ๋Œ€๋กœ READ COMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์ด ์ปค๋ฐ‹๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ทธ๋Ÿฌํ•œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์กฐํšŒํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

 

 

4) UPDATEํ•œ Session์—์„œ COMMITํ•œ ํ›„ ๋‹ค๋ฅธ Session์—์„œ SELECT ์ˆ˜ํ–‰

์œ„ ๊ฒฐ๊ณผ์ฒ˜๋Ÿผ COMMIT์„ ์ง„ํ–‰ํ•œ ํ›„ ๋‹ค๋ฅธ Session์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ˆ˜์ •ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋ฉ๋‹ˆ๋‹ค.

 

 

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

READ COMMITTED ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋„ "NON-REPEATABLE READ"๋ผ๋Š” ๋ถ€์ •ํ•ฉ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

"NON-REPEATABLE READ" - READ COMMITTED 

์œ„ ๊ทธ๋ฆผ์—์„œ ์‚ฌ์šฉ์ž B๊ฐ€ BEGIN ๋ช…๋ น์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  first_name = 'Toto'์ธ ์‚ฌ์›์„ ์กฐํšŒํ•˜๋ฉด ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ดํ›„์— ์‚ฌ์šฉ์ž A๊ฐ€ emp_no = 50000์ธ ์‚ฌ์›์˜ ์ด๋ฆ„์„ 'Toto'๋กœ ์ˆ˜์ •ํ•˜๊ณ  ์ปค๋ฐ‹ํ•œ ํ›„ ์‚ฌ์šฉ์ž B๋Š” ๋™์ผํ•œ ์ฟผ๋ฆฌ๋กœ ์กฐํšŒํ•˜๋ฉด ์ด๋ฒˆ์—๋Š” ๊ฒฐ๊ณผ๊ฐ€ 1๊ฑด์ด ์กฐํšŒ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

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

 

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

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

 

 

"NON-REPEATABLE READ" - READ COMMITTED ํ…Œ์ŠคํŠธ


1) ์กฐํšŒ์ „์šฉ Session์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

 

 

2) ๋‹ค๋ฅธ Session์—์„œ ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ - UPDATE - COMMIT ์ˆœ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

3) ์กฐํšŒ์ „์šฉ Session์—์„œ ๋‹ค์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

์ด์ „๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜๋‚ด์—์„œ ๋™์ผํ•œ SELECT ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” "REPEATABLE READ" ์ •ํ•ฉ์„ฑ์— ์–ด๊ธ‹๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

2-3) 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๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜ ๊ฐ€์šด๋ฐ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ณด๋‹ค ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๊ฐ€ ์•ž์„  ์–ธ๋‘ ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๋Š” ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

REPEATABLE READ

์œ„ ๊ทธ๋ฆผ์€ REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € employees ํ…Œ์ด๋ธ”์€ ๋ฒˆํ˜ธ๊ฐ€ 6์ธ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด INSERT๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž A๊ฐ€ emp_no = 50000์ธ ์‚ฌ์›์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ณผ์ •์—์„œ ์‚ฌ์šฉ์ž B๊ฐ€ emp_no = 50000์ธ ์‚ฌ์›์„ SELECTํ•  ๋•Œ ์–ด๋– ํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ์„œ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

 

์‚ฌ์šฉ์ž A์˜ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋Š” 12์ด๊ณ , ์‚ฌ์šฉ์ž B์˜ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋Š” 10์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉ์ž A๋Š” ์‚ฌ์›์˜ ์ด๋ฆ„์„ 'Toto'๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ปค๋ฐ‹์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์šฉ์ž B๋Š” emp_no = 50000์ธ ์‚ฌ์›์„ A ํŠธ๋žœ์žญ์…˜์ด ๋ณ€๊ฒฝ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊ณผ ์‹คํ–‰ํ•œ ํ›„ ๊ฐ๊ฐ ์กฐํšŒ๋ฅผ ํ–ˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ๋™์ผํ•œ 'JuBal'๋ผ๋Š” ๊ฐ’์„ SELECTํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž B๊ฐ€ BEGIN ๋ช…๋ น์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๋ฉด์„œ 10๋ฒˆ์ด๋ผ๋Š” ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌ๋ฐ›์•˜๋Š”๋ฐ, ๊ทธ๋•Œ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž B์˜ 10๋ฒˆ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  SELECT ์ฟผ๋ฆฌ๋Š” ์ž์‹ ์˜ ํŠธ๋žœ์žญ์…˜์ธ 10๋ฒˆ ๋ณด๋‹ค ์ž‘์€ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ์—์„œ ๋ณ€๊ฒฝํ•œ ๊ฒƒ๋งŒ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

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

 

 

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

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

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

"PHANTOM READ(PHANTOM ROW)" - REPEATABLE READ

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

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

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

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

 

โ€ป ํ•˜์ง€๋งŒ InnoDB์—์„œ๋Š” ๋…ํŠนํ•œ ํŠน์„ฑ ๋•Œ๋ฌธ์— REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋„ PHANTOM READ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ MySQL์˜ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ๋Š” ์ฃผ๋กœ REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์•„๋‹๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

(2021.09.13 ์ถ”๊ฐ€) ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋…ํŠนํ•œ ํŠน์„ฑ์ด MVCC ๋‹ค์ค‘ ๋ฒ„์ „ ์ œ์–ด์ž…๋‹ˆ๋‹ค. ์ฆ‰, MySQL-InnoDB๋Š” MVCC ๋‹ค์ค‘ ๋ฒ„์ „ ์ œ์–ด์— ์˜ํ•ด PHANTOM READ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋‚ด์šฉ์ด ๊ถ๊ธˆํ•˜์‹œ๋ฉด ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š” :)

https://titanwolf.org/Network/Articles/Article?AID=4b782e0d-c711-48a6-a94a-e68abcdd05f9#gsc.tab=0

 

 

 

2-4) SERIALIZABLE


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

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

 

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

 

 

 

2-5) ์ •๋ฆฌ


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

 

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

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

 

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

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

 

 

 

References

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€