๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

[DB] ํŠธ๋žœ์žญ์…˜ ACID ์†์„ฑ๊ณผ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

์†Œ์˜ ๐Ÿ€ 2025. 3. 28. 11:02

์ฃผ์ œ

ํŠธ๋žœ์žญ์…˜์˜ ACID ์†์„ฑ ์ค‘ ๊ฒฉ๋ฆฌ์„ฑ(Isolation)์ด ๋ณด์žฅ๋˜์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ๋“ค์„ ์„ค๋ช…ํ•˜๊ณ ,

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

ํŠธ๋žœ์žญ์…˜์ด๋ž€?

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

ACID

ACID๋Š” ํŠธ๋žœ์žญ์…˜์„ ์ •์˜ํ•˜๋Š” 4๊ฐ€์ง€ ์†์„ฑ์„ ๋งํ•œ๋‹ค.

์›์ž์„ฑ A: Atomicity

ํŠธ๋žœ์žญ์…˜์€ ์›์ž์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ์—ฐ์‚ฐ๋“ค์˜ ๋ฌถ์€ ํ•˜๋‚˜์˜ ๋‹จ์œ„์ด๋‹ค.
์›์ž์ ์ด๋ž€, ์ž‘์—… ์ˆ˜ํ–‰ ์‹œ ์ด ๋ชจ๋“  ์—ฐ์‚ฐ๋“ค์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

๋ถ€๋ถ„์ ์œผ๋กœ ์„ฑ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋„๋ก
๋ชจ๋‘ ์„ฑ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ปค๋ฐ‹ํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ๋Š” ๋กค๋ฐฑํ•˜์—ฌ ์•„๋ฌด๊ฒƒ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์•ผ ํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ๊ณ„์ขŒ์ด์ฒด๋ผ๋Š” ํ•˜๋‚˜์˜ ์ž‘์—… ๋‹จ์œ„์—๋Š” ๋‘ ๋‹จ๊ณ„๊ฐ€ ์žˆ๋‹ค.

  1. A ๊ณ„์ขŒ์—์„œ 100๋งŒ์›์„ ์ถœ๊ธˆํ•œ๋‹ค.
  2. B ๊ณ„์ขŒ์— 100๋งŒ์›์„ ์ž…๊ธˆํ•œ๋‹ค.

๋งŒ์•ฝ 1๋ฒˆ๋งŒ ๋ถ€๋ถ„์ ์œผ๋กœ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ 2๋ฒˆ๋งŒ ์„ฑ๊ณตํ•˜๋Š” ์ผ์€ ์—†์–ด์•ผ ํ•œ๋‹ค.
1, 2๋ฒˆ ๋ชจ๋‘ ์„ฑ๊ณตํ•˜์—ฌ ๊ณ„์ขŒ์ด์ฒด๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ด๋ค„์ง€๊ฑฐ๋‚˜(์ปค๋ฐ‹)
1๋ฒˆ์„ ์„ฑ๊ณตํ–ˆ์ง€๋งŒ 2๋ฒˆ์—์„œ ์‹คํŒจํ–‡๋‹ค๋ฉด 1๋ฒˆ๊ณผ 2๋ฒˆ ๋‘˜ ๋‹ค ์‹คํŒจ๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•œ๋‹ค.(๋กค๋ฐฑ)

์ผ๊ด€์„ฑ C: Consistency

ํŠธ๋žœ์žญ์…˜์ด ์ผ์–ด๋‚˜๋“  ๋ง๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ•ญ์ƒ ์ผ๊ด€๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ œ์•ฝ์กฐ๊ฑด์ด๋‚˜ ๊ทœ์น™์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

NOT NULL์ด๋‚˜ UNIQUE ์ด๋Ÿฐ ์ œ์•ฝ์กฐ๊ฑด ์™ธ์—๋„
์ฃผ๋ฌธ ๋‚ด์—ญ์„ ๋‹ค๋ฃจ๋Š” Order ํ…Œ์ด๋ธ”์— ๊ธฐ๋ก๋œ ์ด ๊ฐ€๊ฒฉ์€ ์ฃผ๋ฌธํ•œ Item๋“ค์˜ ๊ฐ€๊ฒฉ์˜ ํ•ฉ๊ณผ ๋Š˜ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ์‚ฌํ•ญ ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค.

๊ฒฉ๋ฆฌ์„ฑ I: Isolation

๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜๊ณผ ๊ฒฉ๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.
์ฆ‰, ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์€ ์„œ๋กœ ๋…๋ฆฝ์ ์ด๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ A์™€ ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋„ ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น˜๋ฉด ์•ˆ ๋œ๋‹ค.

์ง€์†์„ฑ D: Durability

ํŠธ๋žœ์žญ์…˜์ด ํ•œ ๋ฒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ปค๋ฐ‹๋˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋Š” ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ˜์˜๋œ๋‹ค.
์ปค๋ฐ‹๋œ ์ดํ›„์—๋Š” ๊ทธ ํ›„์— ์‹œ์Šคํ…œ ์žฅ์•  ๋“ฑ์ด ์ผ์–ด๋‚˜๋“  ์•„๋‹ˆ๋“  ์˜๊ตฌ์ ์œผ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ฒฉ๋ฆฌ์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด?

๊ฒฉ๋ฆฌ์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฉด,
์ฆ‰ ํ•œ ํŠธ๋žœ์žญ์…˜์ด ์‚ฌ์šฉ ์ค‘์ธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋ฉด
ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

Dirty Read

The transaction reads a row that has been changed, but the change has not been commited. If the change is rolled back, the transaction has incorrect data.

 

ํŠธ๋žœ์žญ์…˜์ด ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ๋Š”๋ฐ
๊ทธ ์ˆ˜์ •์ด ์ปค๋ฐ‹๋˜์ง€ ์•Š๊ณ  ๋กค๋ฐฑ๋˜๋ฉด, ํŠธ๋žœ์žญ์…˜์€ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฒŒ ๋œ๋‹ค.

์ดˆ๊ธฐ์— a = 100 ์œผ๋กœ ์‹œ์ž‘ํ–ˆ๋‹ค.


ํŠธ๋žœ์žญ์…˜ A์—์„œ a = 50์œผ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.

์ด๋•Œ ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ์‹œ์ž‘ํ•˜์—ฌ a๋ฅผ ์ฝ์œผ๋ฉด a = 50 ์ด๋ผ๊ณ  ์ฝ๋Š”๋‹ค.

 

ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ์‹คํŒจํ•˜์—ฌ ๋กค๋ฐฑ์ด ์ผ์–ด๋‚˜๋ฉด
๋‹ค์‹œ a = 100์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ์ฝ์€ a = 50์ด๋ž€ ๊ฐ’์€ ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š”, ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋œ๋‹ค.

Non-repeatable Read

The transaction rereads data that has been changed, and finds changes due to commited transactions.

 

ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์–ด๋А ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ๋‹ค.
๋˜‘๊ฐ™์€ ํŠธ๋žœ์žญ์…˜์—์„œ "๋‹ค์‹œ" ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ๋Š”๋ฐ ๊ฐ’์ด ๋‹ฌ๋ผ์ ธ ์žˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜ A์—์„œ a๋ฅผ ์ฝ์—ˆ์„ ๋•Œ ๊ทธ ๊ฐ’์ด 100์ด์—ˆ๋‹ค.
A์—์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์„ ๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ B์—์„œ a = 50์œผ๋กœ ์ˆ˜์ •ํ•œ๋‹ค.
ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ๋งˆ์น˜๊ณ , ๋‹ค์‹œ a๋ฅผ ์ฝ์—ˆ์„ ๋•Œ ๊ฐ’์ด 50์œผ๋กœ ์•„๊นŒ ์ฝ์—ˆ๋˜ ๊ฐ’๊ณผ ๋‹ค๋ฅด๋‹ค.

 

๋งŒ์•ฝ ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ์ฒ˜์Œ์— ์ฝ์€ a ๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด ๊ณค๋ž€ํ•ด์ง„๋‹ค.

Phantom Read

The transaction rereads data and finds new rows inserted by a commited transactions.

 

ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฝ์—ˆ๋Š”๋ฐ ์ด์ „์— ์—†๋˜ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋œ๋‹ค.

์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹์œผ๋กœ ์ƒ๊ธด๋‹ค.

ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ User ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ๋‹ค. ์ด๋•Œ ์ฝ์€ row ์ˆ˜๋Š” 1๊ฐœ๋‹ค.

ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ๋๋‚˜์ง€ ์•Š์•˜๋Š”๋ฐ ํŠธ๋žœ์žญ์…˜ B์—์„œ User ํ…Œ์ด๋ธ”์— ์ƒˆ๋กœ์šด row๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปค๋ฐ‹ํ•œ๋‹ค.

ํŠธ๋žœ์žญ์…˜ A๊ฐ€ ๋‹ค์‹œ User ํ…Œ์ด๋ธ”์„ ์ฝ์—ˆ๋”๋‹ˆ ์ด์ „ ์กฐํšŒ ๋•Œ๋Š” ์—†๋˜ ๋ฐ์ดํ„ฐ Bob์ด ์ƒ๊ฒผ๋‹ค.

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

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ž€,
ํ•œ ํŠธ๋žœ์žญ์…˜์ด ์‚ฌ์šฉ ์ค‘์ธ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ ‘๊ทผ ํ—ˆ์šฉ ์ •๋„๋ฅผ ๋งํ•œ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์กฐ์ •ํ•˜์—ฌ์œ„ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ์ด 4๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • Lv 0: Read Uncommited
  • Lv 1: Read Commited
  • Lv 2: Repeatable Read
  • Lv 3: Serializable

๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋†’์„์ˆ˜๋ก ๊ฒฉ๋ฆฌ์„ฑ์ด ๋ณด์žฅ๋˜์–ด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์€ ๋†’์•„์ง€๊ณ ,

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•  ์ผ์ด ์ค„์–ด๋“ ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์„ฑ(๋™์‹œ ์‚ฌ์šฉ์ž ์ ‘์†์œจ)์€ ๋‚ฎ์•„์ง„๋‹ค.

Read Uncommited

์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

ํŠธ๋žœ์žญ์…˜ T2๊ฐ€ ํŠธ๋žœ์žญ์…˜ T1์ด ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.
์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์€ ๊ฒƒ์ด๋‹ค.(Read Uncommited)

์ด ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜ ๊ฐ„์˜ ๊ฒฉ๋ฆฌ๊ฐ€ ์ „ํ˜€ ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ
Dirty Read, Nonrepeatable Read, Phantom Read ๋ฌธ์ œ๊ฐ€ ๋ชจ๋‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

Read Commited

์ปค๋ฐ‹๋œ ๋ณ€๊ฒฝ๋งŒ ์ฝ๋„๋ก ์ˆ˜์ •ํ•˜๋ฉด
Dirty Read๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜ T2์—์„œ ์–ด๋А ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ ค๊ณ  ํ•  ๋•Œ
๋งŒ์•ฝ ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ํŠธ๋žœ์žญ์…˜ T1์—์„œ ์ˆ˜์ •๋˜๊ณ  ์žˆ๋‹ค๋ฉด
ํŠธ๋žœ์žญ์…˜ T2๋Š” ํŠธ๋žœ์žญ์…˜ T1์ด ์ปค๋ฐ‹ํ•  ๋•Œ๊นŒ์ง€ ๊ฐ’์„ ์ฝ์ง€ ์•Š๋Š”๋‹ค.

 

์ปค๋ฐ‹์ด ๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์ฝ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ผ์ด ์—†์–ด Dirty Read๊ฐ€ ๋ฐฉ์ง€๋œ๋‹ค.


๊ทธ๋Ÿฌ๋‚˜ ์•„์ง ํŠธ๋žœ์žญ์…˜ T1์ด ๋๋‚˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํŠธ๋žœ์žญ์…˜ T2๊ฐ€ ์ปค๋ฐ‹์„ ํ•˜๋ฉด T1์ด ๊ฐ’์„ ๋‹ค์‹œ ์ฝ์—ˆ์„ ๋•Œ
์ด์ „์— ์ฝ์€ ๊ฐ’๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰, Non-Repeatable Read ๋ฌธ์ œ๋Š” ์•„์ง ๋ฐœ์ƒํ•œ๋‹ค.
๋น„์Šทํ•˜๊ฒŒ Phantom Read ์—ญ์‹œ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.

  • PostgreSQL์˜ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ๋‹จ๊ณ„์ด๋‹ค.

Repeatable Read

Read Commited์—์„œ ๋” ๋‚˜์•„๊ฐ€
ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ด์ „์— ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฝ์—ˆ์„ ๋•Œ ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๋˜‘๊ฐ™์Œ์„ ๋ณด์žฅํ•œ๋‹ค.

Non-Repeatable Read๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์ž‡๋‹ค.

MySQL, PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ ์Šค๋ƒ…์ƒท์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋‹จ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

ํŠธ๋žœ์žญ์…˜ T1์—์„œ ์ฒ˜์Œ์œผ๋กœ a๋ฅผ ์ฝ์„ ๋•Œ ์Šค๋ƒ…์ƒท์„ ๋งŒ๋“ค์–ด ๋‘๊ณ , ์ดํ›„ a๋ฅผ ๋‹ค์‹œ ์กฐํšŒํ•  ๋•Œ๋Š” ์Šค๋ƒ…์ƒท์—์„œ ์ฝ์–ด ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ์–ธ์ œ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

 

-> Non-Repeatable Read ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.


๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์ •๋œ ๊ฐ’์€ ์ƒ๊ด€ ์—†์ง€๋งŒ
๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ถ”๊ฐ€ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์—ฌ์ „ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋•Œ๋ฌธ์— Phantom Read ๋ฌธ์ œ๋Š” ๊ณ„์† ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • MySQL์˜ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ๋‹จ๊ณ„์ด๋‹ค.

Serializable

Serializable์€ ์ง€๊ธˆ๊นŒ์ง€์˜ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์œผ๋กœ,
ํ•œ ํŠธ๋žœ์žญ์…˜์ด ์–ด๋А ๋ฐ์ดํ„ฐ์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์„ ๋•Œ
๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฝ(lock)์„ ๊ฑด๋‹ค.

 

๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€๋งŒ
์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์—์„œ ํ•œ ๋ฐ์ดํ„ฐ์— ๋™์‹œ ์ ‘๊ทผํ•˜๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ
๋™์‹œ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์ด ๋–จ์–ด์ ธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ๋“œ๋ฝ

Seriablizable์—์„œ ๋ฝ์„ ๊ฑธ๋ฉด ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•ด์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ๋ถ€์ž‘์šฉ์œผ๋กœ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ๋“œ๋ฝ์ด๋ž€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜๋“ค์ด ์‹คํ–‰์„ ํ•˜์ง€ ๋ชปํ•˜๊ณ , ์„œ๋กœ ๋ฌดํ•œ์ • ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

ํŠธ๋žœ์žญ์…˜ T1์—์„œ๋Š” User ํ…Œ์ด๋ธ”์˜ id=1, id=2์ธ ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜์ •ํ•˜๋ ค ํ•˜๊ณ ,
ํŠธ๋žœ์žญ์…˜ T2์—์„œ๋Š” User ํ…Œ์ด๋ธ”์˜ id=2, id=1 ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

T1์—์„œ id=2์ธ row์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ด๋ฏธ ๊ทธ ๋ฐ์ดํ„ฐ์˜ ๋ฝ์€ T2๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. T2์—์„œ id=1์ธ row์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ด๋ฏธ ๊ทธ ๋ฐ์ดํ„ฐ์˜ ๋ฝ์€ T1์ด ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฝ์„ ๋จผ์ € ์„ ์ ํ•˜๊ณ  ์žˆ๋˜ ํŠธ๋žœ์žญ์…˜์—๊ฒŒ์„œ ๋ฝ์˜ ์†Œ์œ ๊ถŒ์„ ์–ป์–ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ๋‘ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋‘ ์ปค๋ฐ‹๋˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ๋˜์ง€ ์•Š์•„ ๋ฝ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์—†์–ด ๋ฝ์„ ๊ณ„์† ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด์„œ๋„ ๋‹ค์Œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด ๋ฌดํ•œ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋น ์ง„๋‹ค.

์Šคํ”„๋ง์—์„œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์„ค์ •

@Transactional ์• ๋…ธํ…Œ์ด์…˜์—์„œ isolation ์„ค์ •์œผ๋กœ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Transactional(isolation=Isolation.REPEATABLE_READ)
public void someMethod() { ... }

๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์ •๋ฆฌ

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด
ํŠธ๋žœ์žญ์…˜ ๊ฐ„์˜ ๊ฒฉ๋ฆฌ ์ •๋„๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

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

๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋†’์•„์งˆ์ˆ˜๋ก ๋ฌธ์ œ๋“ค์ด ํ•ด๊ฒฐ๋˜์–ด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด ๋†’์•„์ง€์ง€๋งŒ
๋™์‹œ์„ฑ์€ ๋‚ฎ์•„์ ธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

๋ฐ˜์‘ํ˜•