Database

์‹ค๋ฌด์—์„œ ๋ฐœ์ƒํ•œ ๋ฐ๋“œ๋ฝ์„ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ• ๋ฐ ๊ณ ๋ฏผ์ 

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2026. 3. 25.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://pubul.tistory.com/36

 

 

 

 

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พธ๋Š” ์ผ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ œ๊ฐ€ ์‹ค์ œ๋กœ ๊ฒช์—ˆ๋˜ ๋ฐ๋“œ๋ฝ ๋ฌธ์ œ์™€ ๊ทธ ํ•ด๊ฒฐ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ “์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค”๊ฐ€ ์•„๋‹ˆ๋ผ, ์™œ ๊ทธ๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  ์–ด๋–ค ์„ ํƒ์ง€๋ฅผ ๊ณ ๋ฏผํ–ˆ๋Š”์ง€๊นŒ์ง€ ํฌํ•จํ•ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

1๏ธโƒฃ ๋ฐ๋“œ๋ฝ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋ฐ๋“œ๋ฝ(Deadlock)์€ ๋‹จ์ˆœํžˆ “๋ฝ์ด ๊ฑธ๋ ค์„œ ๋ฉˆ์ถ˜ ์ƒํƒœ”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
๋ณด๋‹ค ์ •ํ™•ํžˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐœ ์ด์ƒ์˜ ์ž‘์—…์ด ์„œ๋กœ๊ฐ€ ๊ฐ€์ง„ ์ž์›์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ์˜์›ํžˆ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ

 

์ด๋ฅผ ์กฐ๊ธˆ ๋” ์ผ๋ฐ˜์ ์ธ ์ปดํ“จํ„ฐ ๊ณตํ•™ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ ์ž‘์—…(์Šค๋ ˆ๋“œ, ํ”„๋กœ์„ธ์Šค, ํŠธ๋žœ์žญ์…˜)์€ ์ž์›์„ ์ ์œ ํ•œ ์ƒํƒœ์—์„œ
  2. ๋‹ค๋ฅธ ์ž‘์—…์ด ์ ์œ ํ•œ ์ž์›์„ ์ถ”๊ฐ€๋กœ ์š”์ฒญํ•˜๊ณ 
  3. ๊ทธ ์š”์ฒญ์ด ์„œ๋กœ ๊ผฌ์ด๋ฉด์„œ
  4. ์•„๋ฌด๋„ ์ž์›์„ ๋‚ด๋ ค๋†“์ง€ ์•Š๋Š” ์ƒํƒœ

์ฆ‰, “์„œ๋กœ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ์•„๋ฌด๋„ ๋๋‚˜์ง€ ์•Š๋Š” ์ƒํƒœ”์ž…๋‹ˆ๋‹ค.

 

์ด๊ฑด DB์—๋งŒ ๊ตญํ•œ๋œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ๋“  ์˜์—ญ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ
  • OS ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ
  • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ (๋ฝ ์„œ๋น„์Šค)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜

ํŠนํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” Row Lock, Table Lock ๊ฐ™์€ ๊ฐœ๋…์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

๋Œ€๋ถ€๋ถ„์˜ RDBMS (PostgreSQL ํฌํ•จ)๋Š” ๋ฐ๋“œ๋ฝ์„ ๊ฐ์ง€ํ•˜๋ฉด “๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ฐ•์ œ๋กœ ๋กค๋ฐฑ”ํ•ฉ๋‹ˆ๋‹ค. ์ผ์ • ์‹œ๊ฐ„ (deadlock_timeout, ๊ธฐ๋ณธ 1์ดˆ) ๋Œ€๊ธฐ ํ›„ ํŠธ๋žœ์žญ์…˜๋“ค์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. PostgreSQL์€ โ‘ ๋‚ด๋ถ€์ ์œผ๋กœ ๋น„์šฉ์ด ๋” ์ ์€ ํŠธ๋žœ์žญ์…˜, โ‘ก๋กค๋ฐฑ ๋น„์šฉ์ด ๋‚ฎ์€ ์ชฝ์„ ํฌ์ƒ์ž๋กœ ์„ ํƒํ•ด์„œ ์ฃฝ์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

DB๋Š” ๋ฐ๋“œ๋ฝ์„ “ํ•ด๊ฒฐ”ํ•˜์ง€ ์•Š๊ณ , ๋‹จ์ง€ ํ•˜๋‚˜๋ฅผ ์ฃฝ์—ฌ์„œ ์ˆœํ™˜๋Œ€๊ธฐ ์ƒํ™ฉ์„ ๋๋‚ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

 

 

2๏ธโƒฃ ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ์กฐ๊ฑด

๋ฐ๋“œ๋ฝ์€ ์•„๋ฌด ๋•Œ๋‚˜ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹ค์Œ 4๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋ชจ๋‘ ๋งŒ์กฑ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

1. ์ƒํ˜ธ ๋ฐฐ์ œ (Mutual Exclusion)

์ž์›์€ ๋™์‹œ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
→ DB์—์„œ๋Š” row lock

 

2. ์ ์œ  ๋Œ€๊ธฐ (Hold and Wait)

์ž์›์„ ๊ฐ€์ง„ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์ž์›์„ ๊ธฐ๋‹ค๋ฆผ

 

3. ๋น„์„ ์  (No Preemption)

์ž์›์„ ๊ฐ•์ œ๋กœ ๋บ์„ ์ˆ˜ ์—†์Œ
→ DB์—์„œ๋Š” lock์„ ๊ฐ•์ œ๋กœ ํšŒ์ˆ˜ํ•˜์ง€ ์•Š์Œ

 

4. ์ˆœํ™˜ ๋Œ€๊ธฐ (Circular Wait)

์„œ๋กœ๊ฐ€ ์„œ๋กœ์˜ ์ž์›์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ตฌ์กฐ

A → B๊ฐ€ ๊ฐ€์ง„ ์ž์› ๊ธฐ๋‹ค๋ฆผ
B → A๊ฐ€ ๊ฐ€์ง„ ์ž์› ๊ธฐ๋‹ค๋ฆผ

์ด 4๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋™์‹œ์— ๋งŒ์กฑ๋˜๋ฉด ๋ฐ˜๋“œ์‹œ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

 

 

3๏ธโƒฃ ์‹ค๋ฌด์—์„œ ๋ฐœ์ƒํ•œ ๋ฐ๋“œ๋ฝ

 

3-1. JSON VIEWER ๊ธฐ๋ฐ˜ UPDATE์—์„œ ๋ฐ๋“œ๋ฝ

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ์„ฑ๋Šฅ ๊ฐœ์„  ๊ณผ์ • ์ดํ›„ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค.

  1. ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ
  2. DB UPDATE๋ฅผ N๋ฒˆ ์ˆ˜ํ–‰

O(N) ์œผ๋กœ DB I/O ํ•˜๋˜ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“  ๋’ค
  • JSON VIEWER ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜
  • JOIN์„ ํ™œ์šฉํ•˜์—ฌ UPDATE๋ฅผ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰

 

 

sno progress_status success_count fail_count
1 NEW 0 1
2 CONFIRM 1 0
3 CANCEL 0 1
4 RETRUN 0 0

 

์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด ์œ„๊ฐ™์€ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ๋งค ํ† ํ”ฝ๋งˆ๋‹ค count ๋ฅผ ์ฆ๊ฐ€ ์‹œ์ผœ์ฃผ๋Š” update ํ•ด์ค˜์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. progress_status ๋ฅผ ๊ธฐ์ค€์œผ๋กœ update ํ•  count ๋“ค์„ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์•„, ์ด๋ฅผ JSON VIERER ๋ฅผ ๋งŒ๋“ค์–ด JOIN ์‚ฌ์šฉํ•ด ํ•œ๋ฒˆ์— UPDATE ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

O(N) → O(1) ๋กœ ๊ฐœ์„ ์ด ๋์ง€๋งŒ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ์ด๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

DB ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” UPDATE ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

DB ๋‚ด๋ถ€ ์‹คํ–‰ ์—”์ง„์˜ row ์ ‘๊ทผ ์ˆœ์„œ๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ JSON VIEWER๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ row๋ฅผ ํ•œ ๋ฒˆ์— UPDATEํ•˜๋”๋ผ๋„
์‹ค์ œ๋กœ DB ๋‚ด๋ถ€์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ํŠธ๋žœ์žญ์…˜ A → row 1 → row 2 ์ˆœ์„œ๋กœ ์ž ๊ธˆ
  • ํŠธ๋žœ์žญ์…˜ B → row 2 → row 1 ์ˆœ์„œ๋กœ ์ž ๊ธˆ

๊ทธ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ํŠธ๋žœ์žญ์…˜ A๊ฐ€ row 1 lock
2. ํŠธ๋žœ์žญ์…˜ B๊ฐ€ row 2 lock
3. A๊ฐ€ row 2๋ฅผ ๊ธฐ๋‹ค๋ฆผ
4. B๊ฐ€ row 1์„ ๊ธฐ๋‹ค๋ฆผ

์ˆœํ™˜ ๋Œ€๊ธฐ ๋ฐœ์ƒ → ๋ฐ๋“œ๋ฝ

 

ํ•ต์‹ฌ์€ “๋™์ผํ•œ ์ฟผ๋ฆฌ”๋ผ๋„ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ํŠธ๋žœ์žญ์…˜๋งˆ๋‹ค ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

 

 

 

3-2. ๋™์ผ ์กฐ๊ฑด UPDATE์—์„œ๋„ ๋ฐœ์ƒํ•œ ๋ฐ๋“œ๋ฝ

๋˜ ๋‹ค๋ฅธ ์ผ€์ด์Šค๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด

  • row 1, 2, 3 ๋ชจ๋‘ data_sid = 'abc'
  • ์ด๋ฅผ ํ•œ ๋ฒˆ์— success๋กœ UPDATE
sno data_sid progress_status result
1 abc NEW NULL → success
2 abc CONFIRM NULL → success
3 abc CANCEL NULL → success

 

UPDATE target_table
SET status = 'success'
WHERE data_sid = 'abc';

 

 

์ด ๊ฒฝ์šฐ๋„ ๋™์ผํ•˜๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ row ์ ‘๊ทผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—

1. ํŠธ๋žœ์žญ์…˜ A → row 1 lock
2. ํŠธ๋žœ์žญ์…˜ B → row 2 lock
3. A → row 2 ๊ธฐ๋‹ค๋ฆผ
4. B → row 1 ๊ธฐ๋‹ค๋ฆผ

→ ๋™์ผํ•˜๊ฒŒ ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ

 

 

 

4๏ธโƒฃ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ๋ฐ ๊ณ ๋ฏผ์ 

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.

 

4-1. ๋‹ค์‹œ N๋ฒˆ UPDATE (Rollback)

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์€ ์›๋ž˜ ๋ฐฉ์‹์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด
  • UPDATE N๋ฒˆ ์ˆ˜ํ–‰

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๋ช…ํ™•ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ ์„œ๋น„์Šค๋Š” I/O Bound ์„œ๋น„์Šค์˜€๊ณ , DB round-trip time์ด ์ง€์—ฐ์‹œ๊ฐ„์˜ ๊ฐ€์žฅ ํฐ ์›์ธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DB I/O ๋ฅผ ์ตœ์†Œํ™” ํ•˜๋Š” ๊ฒƒ์ด ์„œ๋น„์Šค ํ’ˆ์งˆ์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ๋งŒ๋“  ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์€ ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

4-2. SELECT → VIEW → JOIN UPDATE

๋‹ค์Œ์œผ๋กœ ์ƒ๊ฐํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋จผ์ € SELECT๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ 
  2. ์ •๋ ฌ๋œ VIEW๋ฅผ ๋งŒ๋“  ๋’ค
  3. ๊ทธ VIEW๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ UPDATE ์ˆ˜ํ–‰

์ด ์ ‘๊ทผ์˜ ํ•ต์‹ฌ์€ ์ด๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

“UPDATE ๋Œ€์ƒ์˜ ์ˆœ์„œ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ†ต์ œ”

 

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์—๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ถˆํ•„์š”ํ•œ JOIN ์ฆ๊ฐ€
  • ์ฟผ๋ฆฌ ๋ณต์žก๋„ ์ฆ๊ฐ€
  • ์‹คํ–‰ ๊ณ„ํš์ด ๋” ๋น„์‹ธ์งˆ ๊ฐ€๋Šฅ์„ฑ

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ DB๊ฐ€ ORDER BY ๋œ SELECT VIEWER ๋ฅผ ํ†ตํ•ด UPDATE ํ•œ๋‹ค๊ณ  ํ•ด๋„ ์ˆœ์„œ๋ฅผ 100% ๋ณด์žฅํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•˜๊ธฐ ์–ด๋ ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ฌธ์ œ์ ์ด ํ•ด๊ฒฐ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

SELECT *** FOR UPDATE ๋กœ ROW LOCK ์„ ๊ฑธ๊ณ , ์ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์ˆœ์„œ๋Œ€๋กœ UPDATE ํ•˜์—ฌ ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์— ์งˆ์˜ ํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์ด ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ROW LOCK ์„ ์žก๊ณ  ๋„ˆ๋ฌด ์˜ค๋ž˜ ์žˆ๋Š” ์ ๊ณผ, ์‚ฌ๋‚ด ORM ์—์„œ ์ด๋ฅผ ์ €๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๊ทธ๋ž˜์„œ ์ด ๋ฐฉ๋ฒ•๋„ ํ™•์‹คํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋ณด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

 

4-3. UPDATE ์ˆœ์„œ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ์‹ (์ตœ์ข… ํ•ด๊ฒฐ)

๊ฒฐ๊ตญ ๋ฌธ์ œ์˜ ๋ณธ์งˆ์€ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค.

“UPDATE ์ˆœ์„œ๋งŒ ๋ณด์žฅ๋˜๋ฉด ๋ฐ๋“œ๋ฝ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค”

 

๊ทธ๋ž˜์„œ ์ ‘๊ทผ์„ ์™„์ „ํžˆ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋‚ด์—์„  ESQL์ด๋ผ๋Š” ORM์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ์—ฌ๊ธฐ์—๋Š” AFTER๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•œ SELECT , UPDATE ๋“ฑ ๊ตฌ๋ฌธ ๋’ค์— ๋ฐ”๋กœ ๋‹ค์Œ ๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์ž…๋‹ˆ๋‹ค.

 

์ด ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด

  • ์—ฌ๋Ÿฌ UPDATE๋ฅผ
  • ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ์ฒด์ด๋‹ ๊ฐ€๋Šฅ

์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

UPDATE QUERY
.after(UPDATE QUERY)
.after(UPDATE QUERY)
.after(UPDATE QUERY)

 

์ด๋ฅผ ์‹ค์ œ SQL ํ˜•ํƒœ๋กœ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

BEGIN
UPDATE1
UPDATE2
UPDATE3
UPDATE4
UPDATE5
UPDATE6
COMMIT

์ด ๊ตฌ์กฐ์˜ ํ•ต์‹ฌ์€ ๋‹ค์Œ์ž…๋‹ˆ๋‹ค.

  • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜
  • ํ•˜๋‚˜์˜ DB round-trip
  • ํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์ˆœ์ฐจ ์‹คํ–‰

์ฆ‰, O(1) I/O๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ UPDATE ์ˆœ์„œ๋ฅผ ์™„์ „ํžˆ ํ†ต์ œํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 

UPDATE ๊ตฌ๋ฌธ์„ AFTER ๋กœ ๋ฌถ๊ธฐ ์œ„ํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ์•ฝ๊ฐ„์˜ ๋กœ์ง์ด ์กฐ๊ธˆ ์ถ”๊ฐ€ ๋˜์–ด์•ผ ํ–ˆ์ง€๋งŒ, ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ด๋ž€ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. AFTER ๋กœ ์ฒด์ด๋‹ ํ•ด์•ผํ•  UPDATE QUERY ๊ฐ€ ๋ช‡ ์‹ญ๊ฐœ๊ฐ€ ์•„๋‹Œ 5๊ฐœ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

 

 

 

5๏ธโƒฃ ๊ฒฐ๊ณผ ๋ฐ ๋ฐฐ์šด์ 

์ด ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•œ ์ดํ›„ ์•„๋ž˜๊ณผ ๊ฐ™์€ ์„ฑ๊ณผ๋ฅผ ์ด๋ค„๋ƒˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ๋“œ๋ฝ ์™„์ „ ์ œ๊ฑฐ
  • DB round-trip ์œ ์ง€ (์„ฑ๋Šฅ ์œ ์ง€)
  • ํŠธ๋žœ์žญ์…˜ ์•ˆ์ •์„ฑ ํ™•๋ณด

๊ฒฐ๋ก ์ ์œผ๋กœ “์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋™์‹œ์„ฑ ์•ˆ์ •์„ฑ์„ ๋™์‹œ์— ์žก์€ ๊ตฌ์กฐ” ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

๋˜ํ•œ, ์ด๋ฒˆ ๊ฒฝํ—˜์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

1. DB๋Š” ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค

  • ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ํ•ญ์ƒ ์ตœ์ ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ์„ ํƒํ•˜๋ฉฐ, ๊ทธ ๊ณผ์ •์—์„œ row ์ ‘๊ทผ ์ˆœ์„œ๋Š” ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. ๋ฐ๋“œ๋ฝ์˜ ๋ณธ์งˆ์€ ์ˆœํ™˜ ๋Œ€๊ธฐ๋‹ค

  • ๋ฝ์ด ๋งŽ์•„์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฝ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒ

 

3. ํ•ด๊ฒฐ์€ ๋‹จ์ˆœํ•˜๋‹ค — ์ˆœ์„œ๋ฅผ ํ†ต์ œํ•˜๋ผ

  • ๋™์ผํ•œ ์ˆœ์„œ๋กœ lock์„ ์žก์œผ๋ฉด, ๋ฐ๋“œ๋ฝ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค

 

4. ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์€ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์•„๋‹ˆ๋‹ค

  • ์ž˜ ์„ค๊ณ„ํ•˜๋ฉด ๋‘˜ ๋‹ค ์žก์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ฐ๋“œ๋ฝ์€ ๋‹จ์ˆœํ•œ DB ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋™์‹œ์„ฑ ์ œ์–ด์˜ ๋ณธ์งˆ์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์ด๋‚˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ํ™˜๊ฒฝ์—์„œ๋Š” “์–ธ์  ๊ฐ€๋Š” ๋ฐ˜๋“œ์‹œ” ๋งˆ์ฃผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์–ป์€ ๊ฒฐ๋ก ์€ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. “๋ฝ์„ ์ค„์ด๋Š” ๊ฒƒ๋ณด๋‹ค, ๋ฝ์˜ ์ˆœ์„œ๋ฅผ ํ†ต์ œํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค”

 

 

์ด ๊ธ€์ด ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช๋Š” ๋ถ„๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€