ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐ŸŽฏ DataBase Concurrency Controll

Race Condition

๊ฒฝ์Ÿ์ƒํƒœ๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๊ณ , ๋™์‹œ์— ๋ณ€๊ฒฝ์„ ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

  • Race Condition ์œผ๋กœ ๋™์‹œ์— ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋“ค์ด ๊ฐฑ์‹  ์ „ ๊ฐ’์„ ์ฝ๊ณ , ์ˆ˜์ •ํ•˜๋ฉด์„œ
  • ์‹ค์ œ ๊ฐฑ์‹ ์ด ๋ˆ„๋ฝ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒ

Series

Java Concurrency Control

Database Concurrency Control

Redis Concurrency Control

Kafka Concurrency Control

Compare Concurrency Control

Database Lock

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฝ์˜ ์ข…๋ฅ˜

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฝ(Lock)์˜ ์ข…๋ฅ˜์™€ ์—ญํ• 

  • ๊ณต์œ  ๋ฝ(Shared Lock, Read Lock)
    • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ์ฝ๊ธฐ ๋ช…๋ น์— ๋Œ€ํ•ด ์ฃผ์–ด์ง€๋Š” ๋ฝ
    • ๊ณต์œ  ๋ฝ๋ผ๋ฆฌ๋Š” ๋™์‹œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ
  • ๋ฒ ํƒ€ ๋ฝ(Exclusive Lock, Write Lock)
    • ๋ฐ์ดํ„ฐ์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๋Š” ์“ฐ๊ธฐ ๋ช…๋ น๋“ค์— ๋Œ€ํ•ด ์ฃผ์–ด์ง€๋Š” ๋ฝ
    • ๋‹ค๋ฅธ ์„ธ์…˜์ด ํ•ด๋‹น ์ž์›์— ์ ‘๊ทผ(ex. SELECT, INSERT ..) ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
    • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ, ์ž„๊ณ„ ์˜์—ญ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ™œ์šฉ๋˜๋Š” ๋ฎคํ…์Šค์™€ ์œ ์‚ฌ(ํŠธ๋žœ์žญ์…˜ ๋™์•ˆ ์œ ์ง€)
  • ์—…๋ฐ์ดํŠธ ๋ฝ(Update Lock)
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ ํƒ€ ๋ฝ์„ ๊ฑธ๊ธฐ ์ „, ๋ฐ๋“œ๋ฝ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฝ
    • UPDATE ์ฟผ๋ฆฌ์˜ ํ•„ํ„ฐ(WHERE)๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์—์„œ ์ ์šฉ
    • ์ฐธ๊ณ . ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋™์ผํ•œ ์ž์›์— ๋Œ€ํ•ด ์ฝ๊ธฐ ์ฟผ๋ฆฌ ์ดํ›„, ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ conversion deadlock์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ SELECT ํ€ด๋ฆฌ์—์„œ๋„ ์—…๋ฐ์ดํŠธ ๋ฝ์„ ์ ์šฉ(WITH(UPDLOCK))ํ•˜๊ธฐ๋„ ํ•จ
  • ๋‚ด์žฌ ๋ฝ(Intent Lock)
    • ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋ฝ(ex. ํ…Œ์ด๋ธ” ๋ฝ)์„ ๊ฑธ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฝ
    • ๊ณต์œ  ๋ฝ๊ณผ ๋ฒ ํƒ€ ๋ฝ ์•ž์— I ๊ธฐํ˜ธ๋ฅผ ๋ถ™์ธ IS, IX, SIX ๋“ฑ์ด ์žˆ์Œ

๐Ÿน DataBase Pessimistic Lock

๋ฐ์ดํ„ฐ(Row or Table)์— Lock ์„ ๊ฑธ์–ด์„œ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถ”๋Š” ๋ฐฉ๋ฒ•

์ •์˜.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฐํƒ€ ๋ฝ(Exclusive Lock)์„ ์‚ฌ์šฉ
  • ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฝ์„ ์œ ์ง€
  • ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ํ™˜๊ฒฝ์—์„œ ์œ ์šฉ
    • ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅ

๋™์ž‘ ๋ฐฉ์‹.

  1. ๋ฝ ํš๋“: ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋ฝ์„ ํš๋“
  2. ๋ฝ ์œ ์ง€: ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฝ์„ ์œ ์ง€ํ•˜์—ฌ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•จ
  3. ๋ฝ ํ•ด์ œ: ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ๋˜๋ฉด ๋ฝ์„ ํ•ด์ œํ•˜์—ฌ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

์žฅ์ .

  • ๋ฐ์ดํ„ฐ ์ถฉ๋Œ ๋ฐฉ์ง€ โ†’ ์ถฉ๋Œ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚œ๋‹ค๋ฉด Optimistic Lock ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹์„ ์ˆ˜ ์žˆ์Œ
  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ โ†’ ๋ฐ์ดํ„ฐ ์ถฉ๋Œ ์ „ ํŠธ๋žœ์žญ์…˜์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จ

๋‹จ์ .

  • ์„ฑ๋Šฅ ์ €ํ•˜ โ†’ ๋Œ€๊ธฐํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์ด ๋งŽ์•„์ง€๋ฉด ์‹œ์Šคํ…œ์˜ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ ์ €ํ•˜
  • Deadlock โ†’ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์ž‘์—…์ด ๋๋‚˜๊ธฐ๋งŒ์„ ๋Œ€๊ธฐํ•˜๋Š” ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์„ ์ €ํ•˜
  • ์ž์› ๋‚ญ๋น„ โ†’ ์ถฉ๋Œ์ด ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ž์› ์‚ฌ์šฉ
  • ๋ณต์žก์„ฑ ์ฆ๊ฐ€ โ†’ ๋น„๊ด€์  ๋ฝ ๊ด€๋ฆฌ ๋ฐ ๊ต์ฐฉ ์ƒํƒœ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ๋ณต์žก์„ฑ์ด ๋ฐœ์ƒ

์‚ฌ๋ก€.

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

.

Database Pessimistic Lock example

.

๐Ÿ› ๏ธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ.

  • ํ•œ์ • ์ˆ˜๋Ÿ‰: 50,000
  • User: 296
  • Processes: 8
  • Threads: 37
  • Duration: 3 min

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ •ํ™•ํ•˜๊ฒŒ 50,000 ๊ฑด๋งŒ ์„ฑ๊ณต์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

02:10 ์ดํ›„์—๋Š” ๋ชจ๋“  ์ˆ˜๋Ÿ‰์ด 0์œผ๋กœ ์กฐํšŒ๋˜์–ด, ์žฌ๊ณ  ๋ถ€์กฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

Result

๐Ÿน DataBase Optimistic Lock

ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ ๋ณ„๋„์˜ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ,

๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ์‹œ์ ์— ์ถฉ๋Œ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ

์ •์˜.

  • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์‹ค์ œ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ •๋  ๋•Œ ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒ„์ „ ๋ฒˆํ˜ธ๋‚˜ ํƒ€์ž„์Šคํƒฌํ”„ ๊ฐ™์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„
  • ๋ฒ„์ „ ์ถฉ๋Œ ์‹œ ์žฌ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ
  • ์ถฉ๋Œ์ด ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ

๋™์ž‘ ๋ฐฉ์‹.

  1. ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ: ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ ํ˜„์žฌ์˜ ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ํ•จ๊ป˜ ์กฐํšŒ
  2. ๋ฐ์ดํ„ฐ ์ˆ˜์ • ์‹œ๋„: ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ, ์ €์žฅ ์‹œ์ ์— ๋ฒ„์ „ ๋ฒˆํ˜ธ๊ฐ€ ์กฐํšŒ ๋•Œ์™€ ๋™์ผํ•œ์ง€ ํ™•์ธ
  3. ์ถฉ๋Œ ๊ฐ์ง€: ๋งŒ์•ฝ ๋ฒ„์ „ ๋ฒˆํ˜ธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉด, ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฑฐ๋ถ€ โ†’ ์žฌ์‹œ๋„ ๋˜๋Š” ๋กค๋ฐฑ ์ˆ˜ํ–‰
  4. ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰: ์ถฉ๋Œ์ด ์—†๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋ฒ„์ „ ๋ฒˆํ˜ธ๋กœ ์—…๋ฐ์ดํŠธ

์žฅ์ .

  • ๋†’์€ ๋™์‹œ์„ฑ โ†’ ๋ฐ์ดํ„ฐ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ๋™์‹œ์„ฑ์„ ํ–ฅ์ƒ
  • ์„ฑ๋Šฅ ํ–ฅ์ƒ โ†’ ์ž ๊ธˆ์œผ๋กœ ์ธํ•œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์—†์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ
    • ๋ฐ์ดํ„ฐ ์ถฉ๋Œ์ด ์ ์€ ์‹œ์Šคํ…œ์—์„œ ํšจ๊ณผ์ 
  • ๊ต์ฐฉ ์ƒํƒœ ๋ฐฉ์ง€ โ†’ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

๋‹จ์ .

  • ์ถฉ๋Œ ์ฒ˜๋ฆฌ ๋น„์šฉ โ†’ ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ์žฌ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ๋กค๋ฐฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ถฉ๋Œ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋น„์šฉ ๋ฐœ์ƒ
    • ์žฌ์‹œ๋„๋ฅผ ํ•  ๊ฒฝ์šฐ ๋กœ์ง์„ ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ ๋ณต์žก์„ฑ ์ฆ๊ฐ€
  • ๋ณต์žก์„ฑ ์ฆ๊ฐ€ โ†’ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€

์‚ฌ๋ก€.

  • ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์€ ํ™˜๊ฒฝ โ†’ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ , ์ฝ๊ธฐ ์ž‘์—…์ด ์ฃผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ํ™˜๊ฒฝ
  • ๋†’์€ ๋™์‹œ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ โ†’ ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์งง์€ ํŠธ๋žœ์žญ์…˜ โ†’ ํŠธ๋žœ์žญ์…˜์ด ์งง๊ณ  ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์„ ๋•Œ ํšจ๊ณผ์  (ex. ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์กฐํšŒ ๋ฐ ์—…๋ฐ์ดํŠธ)
[pool-1-thread-1] [quantity] before: 100, after: 99
[pool-1-thread-4] [quantity] before: 100, after: 99
[pool-1-thread-5] [quantity] before: 100, after: 99
...
[pool-1-thread-4] fail to update stock // ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ๊ฑฐ๋ถ€
[pool-1-thread-5] fail to update stock
[pool-1-thread-7] fail to update stock
...
์žฌ๊ณ ๋Š” 0๋ณด๋‹ค ์ž‘์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์žฌ๊ณ ๋Š” 0๋ณด๋‹ค ์ž‘์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

.

database optimistic lock example

.

๐Ÿ› ๏ธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ.

  • ํ•œ์ • ์ˆ˜๋Ÿ‰: 50,000
  • User: 296
  • Processes: 8
  • Threads: 37
  • Duration: 3 min

์—…๋ฐ์ดํŠธ์— ์‹คํŒจํ•  ๊ฒฝ์šฐ ์žฌ์‹œ๋„๋ฅผ ํ•˜๋‹ค ๋ณด๋‹ˆ ์ฒ˜๋ฆฌ๋Ÿ‰์ด Pessimistic Lock ๋ฐฉ์‹๋ณด๋‹ค ๋‚ฎ์„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋™์ผํ•œ ์กฐ๊ฑด์œผ๋กœ ํ…Œ์ŠคํŠธํ–ˆ์Œ์—๋„ 38,491 ๊ฑด๋งŒ ์„ฑ๊ณต์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Result

๐Ÿน DataBase Named Lock

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํŠน์ • ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ž ๊ธˆ์„ ํš๋“ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜

์ •์˜.

  • ํŠน์ • ๋ฐ์ดํ„ฐ(Row or Table)์— ๋ฝ์„ ๊ฑฐ๋Š” ๋Œ€์‹  ํŠน์ • ์ด๋ฆ„์— ๋ฝํ‚น
    • ์ด๋ฆ„์ด ๊ฐ™๋‹ค๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋™์ผํ•œ ์ž ๊ธˆ์„ ๊ณต์œ 
  • ์ปค๋„ฅ์…˜ ํ’€ ๋ถ€์กฑ ํ˜„์ƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅ
  • Timeout์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

์žฅ์ .

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

๋‹จ์ .

  • Deadlock โ†’ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํŠธ๋žœ์žญ์…˜์ด ์„œ๋กœ ๋‹ค๋ฅธ Named Lock์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ์˜์›ํžˆ ๋Œ€๊ธฐํ•˜๋Š” ์ƒํ™ฉ
  • ์„ฑ๋Šฅ ์ €ํ•˜ โ†’ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋™์‹œ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ ์ €ํ•˜
    • ํŠนํžˆ ์ž ๊ธˆ์ด ์žฅ๊ธฐ๊ฐ„ ์œ ์ง€๋˜๋ฉด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋Œ€๊ธฐํ•˜๋ฉด์„œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœ
  • ์ž ๊ธˆ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ โ†’ ์ž ๊ธˆ ํš๋“๊ณผ ํ•ด์ œ์˜ ํƒ€์ด๋ฐ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ด€๋ฆฌ ํ•„์š”
    • ์ž˜๋ชป๋œ ๊ด€๋ฆฌ๋กœ ์ž ๊ธˆ์ด ์ œ๋Œ€๋กœ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ์‹œ์Šคํ…œ์˜ ๊ฐ€์šฉ์„ฑ์ด ์ €ํ•˜
  • ํŠธ๋žœ์žญ์…˜ ๋…๋ฆฝ์„ฑ์˜ ์œ„ํ—˜ โ†’ ํŠธ๋žœ์žญ์…˜๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ, ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์ž ๊ธˆ์ด ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž ๊ธˆ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜
    • ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ ์‹œ Lock ์ด ์ž๋™์œผ๋กœ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ณ„๋„์˜ ๋ช…๋ น์–ด๋กœ ๋ฝ ํ•ด์ œ์™€ ์„ธ์…˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”

์‚ฌ๋ก€.

  • ๋ฆฌ์†Œ์Šค ๋™๊ธฐํ™” โ†’ ๋ณต์ˆ˜์˜ ํŠธ๋žœ์žญ์…˜์ด๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉ
    • ex) ๋‹ค์ˆ˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ์„ ์ˆ˜์ •, ๋™์ผํ•œ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•  ๋•Œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€
  • ์ˆœ์ฐจ ์ž‘์—… ์ฒ˜๋ฆฌ โ†’ ํŠน์ • ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์—…์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅ
    • ex) ๋‹ค์ˆ˜์˜ ํŠธ๋žœ์žญ์…˜์ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค ํ•  ๋•Œ ์ž‘์—…์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ด
  • ๋‹ค์ค‘ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ์˜ ๋™๊ธฐํ™” โ†’ ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๋™์ผํ•œ DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ, ์„œ๋ฒ„ ๊ฐ„์˜ ์ž‘์—… ๋™๊ธฐํ™” ๊ฐ€๋Šฅ
    • ex) ์„œ๋ฒ„ ๊ฐ„์˜ ์ž‘์—… ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ผ๊ด€์„ฑ์„ ์œ ์ง€
  • ์ผํšŒ์„ฑ ์ž‘์—… ๋ณด์žฅ โ†’ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—…์—์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก ๋ณด์žฅ

.

database Named Lock example

.

๐Ÿ› ๏ธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ.

  • ํ•œ์ • ์ˆ˜๋Ÿ‰: 10,000
  • User: 40
  • Processes: 2
  • Threads: 20
  • Duration: 3 min

๋‹ค๋ฅธ ๋ฐฉ์‹๊ณผ ๋™์ผํ•œ ์กฐ๊ฑด์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ,

Dead Lock ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์–ด ์•„๋ž˜ ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผํ•˜๊ณ  ์กฐ๊ฑด์„ ์•ฝํ•˜๊ฒŒ ์ค„์ด๊ฒŒ ๋˜์—ˆ๋‹ค.

o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: null
o.h.engine.jdbc.spi.SqlExceptionHelper   : HikariPool-1 - Connection is not available, request timed out after 30004ms (total=40, active=40, idle=0, waiting=159)

๋ฝ์„ ์–ป๊ณ  ๋ฆด๋ฆฌ์ฆˆํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์žฌ๊ณ ๋ฅผ ์ฐจ๊ฐํ•˜๋Š” ๋กœ์ง์ด ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ
ํ•œ ์š”์ฒญ์— ๋‘ ๊ฐœ์˜ ์ปค๋„ฅ์…˜์ด ์‚ฌ์šฉ๋˜๋‹ค ๋ณด๋‹ˆ HikariCP์— ๋Œ€ํ•œ Thread ๊ฐ„ Dead lock์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

Named Lock ์„ ์ ์šฉํ•  ๊ฒฝ์šฐ Connection Pool ์ด ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค ๋ณด๋‹ˆ ๋Œ€๋Ÿ‰์˜ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ์—๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์–ด ๋ณด์ธ๋‹ค.

์ฐธ๊ณ .

maximum-pool-size(40) ๋กœ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ์„ ์ •๋„์˜ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ๋งŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ •ํ™•ํ•˜๊ฒŒ 10,000 ๊ฑด๋งŒ ์„ฑ๊ณต์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๊ณ ,

01:04 ์ดํ›„์—๋Š” ๋ชจ๋“  ์ˆ˜๋Ÿ‰์ด 0์œผ๋กœ ์กฐํšŒ๋˜์–ด, ์žฌ๊ณ  ๋ถ€์กฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

Result

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
๋งํฌ
Total
Today
Yesterday