ํฐ์คํ ๋ฆฌ ๋ทฐ
[๋์์ฑ] DataBase Concurrency Controll(Pessimistic, Optimistic, Named Lock)
Aaron 2024. 8. 17. 21:59๐ฏ DataBase Concurrency Controll
Race Condition
๊ฒฝ์์ํ๋ ๋ ๊ฐ ์ด์์ ์ค๋ ๋๊ฐ ๊ณต์ ๋ฐ์ดํฐ์ ์ก์ธ์ค ํ ์ ์๊ณ , ๋์์ ๋ณ๊ฒฝ์ ํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ ๋ฌธ์
- Race Condition ์ผ๋ก ๋์์ ๋ค์ด์ค๋ ์์ฒญ๋ค์ด ๊ฐฑ์ ์ ๊ฐ์ ์ฝ๊ณ , ์์ ํ๋ฉด์
- ์ค์ ๊ฐฑ์ ์ด ๋๋ฝ๋๋ ํ์์ด ๋ฐ์
Series
Database Lock
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฝ์ ์ข ๋ฅ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฝ(Lock)์ ์ข ๋ฅ์ ์ญํ
- ๊ณต์ ๋ฝ(
S
hared Lock, Read Lock)- ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ์ฝ๊ธฐ ๋ช ๋ น์ ๋ํด ์ฃผ์ด์ง๋ ๋ฝ
- ๊ณต์ ๋ฝ๋ผ๋ฆฌ๋ ๋์์ ์ ๊ทผ์ด ๊ฐ๋ฅ
- ๋ฒ ํ ๋ฝ(E
x
clusive 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
orTable
)์ Lock ์ ๊ฑธ์ด์ ์ ํฉ์ฑ์ ๋ง์ถ๋ ๋ฐฉ๋ฒ
์ ์.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฐํ ๋ฝ(E
x
clusive Lock)์ ์ฌ์ฉ - ํธ๋์ญ์
์ด ์๋ฃ๋ ๋๊น์ง
๋ฝ์ ์ ์ง
์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ํ๊ฒฝ
์์ ์ ์ฉ- ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋์์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅ
๋์ ๋ฐฉ์.
- ๋ฝ ํ๋: ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋ ํด๋น ๋ฐ์ดํฐ์ ๋ํด ๋ฝ์ ํ๋
- ๋ฝ ์ ์ง: ํธ๋์ญ์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ฝ์ ์ ์งํ์ฌ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์์ ํ์ง ๋ชปํ๊ฒ ํจ
- ๋ฝ ํด์ : ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๊ฑฐ๋ ๋กค๋ฐฑ๋๋ฉด ๋ฝ์ ํด์ ํ์ฌ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ ๊ทผํ ์ ์๋๋ก ํจ
์ฅ์ .
๋ฐ์ดํฐ ์ถฉ๋ ๋ฐฉ์ง
โ ์ถฉ๋์ด ๋น๋ฒํ๊ฒ ์ผ์ด๋๋ค๋ฉด Optimistic Lock ๋ณด๋ค ์ฑ๋ฅ์ด ์ข์ ์ ์์๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ
โ ๋ฐ์ดํฐ ์ถฉ๋ ์ ํธ๋์ญ์ ์ ์ ๊ทผ์ ์ฐจ๋จ
๋จ์ .
์ฑ๋ฅ ์ ํ
โ ๋๊ธฐํ๋ ํธ๋์ญ์ ์ด ๋ง์์ง๋ฉด ์์คํ ์ ๋์์ฑ ์ฒ๋ฆฌ ๋ฅ๋ ฅ ์ ํDeadlock
โ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ์๋ก ๋ค๋ฅธ ๋ฆฌ์์ค ์์ ์ด ๋๋๊ธฐ๋ง์ ๋๊ธฐํ๋ ์ํ๊ฐ ๋ฐ์ํ์ฌ ์์คํ ์ฑ๋ฅ์ ์ ํ์์ ๋ญ๋น
โ ์ถฉ๋์ด ๋๋ฌผ๊ฒ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ ๋ฝ์ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ์์ ์ฌ์ฉ๋ณต์ก์ฑ ์ฆ๊ฐ
โ ๋น๊ด์ ๋ฝ ๊ด๋ฆฌ ๋ฐ ๊ต์ฐฉ ์ํ ํด๊ฒฐ์ ์ํด ์ถ๊ฐ์ ์ธ ๋ณต์ก์ฑ์ด ๋ฐ์
์ฌ๋ก.
- ๋ฐ์ดํฐ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ฒฝ์ฐ โ ๋์ผํ ์ํ์ ๋ํ ์ฃผ๋ฌธ์ด ๋์์ ์ฒ๋ฆฌ๋๋ ๊ฒฝ์ฐ
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ๋งค์ฐ ์ค์ํ ๊ฒฝ์ฐ โ ๊ธ์ต ๊ฑฐ๋ ์์คํ ์ด๋ ํ๊ณ ์ํํธ์จ์ด
- ๊ธด ํธ๋์ญ์ ์ฒ๋ฆฌ โ ํธ๋์ญ์ ์ด ๋ณต์กํ๊ณ ๊ธด ์๊ฐ์ด ์์๋๋ ๊ฒฝ์ฐ
.
Database Pessimistic Lock example
.
๐ ๏ธ ์ฑ๋ฅ ํ ์คํธ.
- ํ์ ์๋: 50,000
- User: 296
- Processes: 8
- Threads: 37
- Duration: 3 min
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ ํํ๊ฒ 50,000 ๊ฑด๋ง ์ฑ๊ณต์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
02:10 ์ดํ์๋ ๋ชจ๋ ์๋์ด 0์ผ๋ก ์กฐํ๋์ด, ์ฌ๊ณ ๋ถ์กฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
๐น DataBase Optimistic Lock
ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์์ ํ๋ ๋์ ๋ณ๋์ ์ ๊ธ์ ์ฌ์ฉํ์ง ์๊ณ ,
๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ์์ ์ ์ถฉ๋ ์ฌ๋ถ๋ฅผ ํ์ธ
์ ์.
- ๋ฐ์ดํฐ์ ๋ํ ์ค์ ์ ๊ธ์ ์ฌ์ฉํ์ง ์๊ณ , ๋ฐ์ดํฐ๊ฐ ์์ ๋ ๋
์ถฉ๋์ ๊ฐ์ง
ํ์ฌ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์ง
- ์ผ๋ฐ์ ์ผ๋ก
๋ฒ์ ๋ฒํธ
๋ํ์์คํฌํ
๊ฐ์ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๊ตฌํ - ๋ฒ์ ์ถฉ๋ ์ ์ฌ์๋ํ๊ฑฐ๋ ๋กค๋ฐฑ
- ์ถฉ๋์ด ๋๋ฌผ๊ฒ ๋ฐ์ํ๋ ํ๊ฒฝ์์ ์ฌ์ฉ
๋์ ๋ฐฉ์.
- ๋ฐ์ดํฐ ์ฝ๊ธฐ: ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ํ์ฌ์ ๋ฒ์ ๋ฒํธ๋ฅผ ํจ๊ป ์กฐํ
- ๋ฐ์ดํฐ ์์ ์๋: ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋, ์ ์ฅ ์์ ์ ๋ฒ์ ๋ฒํธ๊ฐ ์กฐํ ๋์ ๋์ผํ์ง ํ์ธ
- ์ถฉ๋ ๊ฐ์ง: ๋ง์ฝ ๋ฒ์ ๋ฒํธ๊ฐ ๋ณ๊ฒฝ๋์์ผ๋ฉด, ์ถฉ๋์ด ๋ฐ์ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ์ ๋ฐ์ดํธ๋ฅผ ๊ฑฐ๋ถ โ ์ฌ์๋ ๋๋ ๋กค๋ฐฑ ์ํ
- ์ ๋ฐ์ดํธ ์ํ: ์ถฉ๋์ด ์๋ค๋ฉด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ , ์๋ก์ด ๋ฒ์ ๋ฒํธ๋ก ์ ๋ฐ์ดํธ
์ฅ์ .
๋์ ๋์์ฑ
โ ๋ฐ์ดํฐ ์ ๊ธ์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ํธ๋์ญ์ ์ด ๋์์ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ฌ ์์คํ ์ ๋์์ฑ์ ํฅ์์ฑ๋ฅ ํฅ์
โ ์ ๊ธ์ผ๋ก ์ธํ ๋๊ธฐ ์๊ฐ์ด ์์ผ๋ฏ๋ก ์ฑ๋ฅ ํฅ์- ๋ฐ์ดํฐ ์ถฉ๋์ด ์ ์ ์์คํ ์์ ํจ๊ณผ์
๊ต์ฐฉ ์ํ ๋ฐฉ์ง
โ ์ ๊ธ์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ์ง ์์
๋จ์ .
์ถฉ๋ ์ฒ๋ฆฌ ๋น์ฉ
โ ์ถฉ๋ ๋ฐ์ ์ ํด๋น ํธ๋์ญ์ ์ ์ฌ์๋ํ๊ฑฐ๋ ๋กค๋ฐฑํด์ผ ํ๋ฏ๋ก ์ถฉ๋ ์ฒ๋ฆฌ์ ๋ํ ๋น์ฉ ๋ฐ์- ์ฌ์๋๋ฅผ ํ ๊ฒฝ์ฐ ๋ก์ง์ ๋ณ๋๋ก ๊ตฌํํด์ผ ํ๋ฏ๋ก ๊ฐ๋ฐ ๋ณต์ก์ฑ ์ฆ๊ฐ
๋ณต์ก์ฑ ์ฆ๊ฐ
โ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ํ์ํ์ฌ ์์คํ ์ ๋ณต์ก์ฑ์ ์ฆ๊ฐ
์ฌ๋ก.
- ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ ํ๊ฒฝ โ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๊ณ , ์ฝ๊ธฐ ์์ ์ด ์ฃผ๋ก ์ด๋ฃจ์ด์ง๋ ํ๊ฒฝ
- ๋์ ๋์์ฑ์ด ํ์ํ ๊ฒฝ์ฐ โ ๋ง์ ์ฌ์ฉ์๊ฐ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ
- ์งง์ ํธ๋์ญ์ โ ํธ๋์ญ์ ์ด ์งง๊ณ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ ๋ ํจ๊ณผ์ (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 ๊ฑด๋ง ์ฑ๊ณต์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๐น DataBase Named Lock
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํน์ ์ด๋ฆ์ ๊ฐ์ง ์ ๊ธ์ ํ๋ํ๊ฑฐ๋ ํด์ ํ๋ ๋ฉ์ปค๋์ฆ
์ ์.
- ํน์ ๋ฐ์ดํฐ(
Row
orTable
)์ ๋ฝ์ ๊ฑฐ๋ ๋์ ํน์ ์ด๋ฆ์ ๋ฝํน- ์ด๋ฆ์ด ๊ฐ๋ค๋ฉด ์๋ก ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๋์ผํ ์ ๊ธ์ ๊ณต์
- ์ปค๋ฅ์ ํ ๋ถ์กฑ ํ์์ ๋ง๊ธฐ ์ํด ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ถ๋ฆฌํด์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅ
- Timeout์ ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
์ฅ์ .
์ ์ฐํ ์ ๊ธ ์ ์ด
โ ํน์ ์ด๋ฆ์ ๋ํ ์ ๊ธ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด์๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋์์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ ํ๋ ฅ
โ ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ฌ ์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ์ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ (์ฃผ๋ก ๋ถ์ฐ๋ฝ ๊ตฌํ ์ ์ฌ์ฉ)ํธ๋์ญ์ ๊ณผ ๋ ๋ฆฝ์
โ ์ผ๋ฐ์ ์ผ๋ก ํธ๋์ญ์ ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ฏ๋ก, ํธ๋์ญ์ ์ ๋กค๋ฐฑ์ด ๋ฐ์ํ๋๋ผ๋ ์ ๊ธ ์ํ๊ฐ ์ ์ง (ํธ๋์ญ์ ๊ฐ์ ๋ณต์กํ ๋๊ธฐํ ์๋๋ฆฌ์ค ์ฒ๋ฆฌ ๊ฐ๋ฅ)
๋จ์ .
Deadlock
โ ๋ ๊ฐ ์ด์์ ํธ๋์ญ์ ์ด ์๋ก ๋ค๋ฅธ Named Lock์ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ์์ํ ๋๊ธฐํ๋ ์ํฉ์ฑ๋ฅ ์ ํ
โ ๊ณผ๋ํ๊ฒ ์ฌ์ฉ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ ์ ํ- ํนํ ์ ๊ธ์ด ์ฅ๊ธฐ๊ฐ ์ ์ง๋๋ฉด ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๋๊ธฐํ๋ฉด์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐ
์ ๊ธ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ
โ ์ ๊ธ ํ๋๊ณผ ํด์ ์ ํ์ด๋ฐ์ ์ ์คํ๊ฒ ๊ด๋ฆฌ ํ์- ์๋ชป๋ ๊ด๋ฆฌ๋ก ์ ๊ธ์ด ์ ๋๋ก ํด์ ๋์ง ์์ผ๋ฉด ์์คํ ์ ๊ฐ์ฉ์ฑ์ด ์ ํ
ํธ๋์ญ์ ๋ ๋ฆฝ์ฑ์ ์ํ
โ ํธ๋์ญ์ ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ฏ๋ก, ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๋๋ผ๋ ์ ๊ธ์ด ํด์ ๋์ง ์์ผ๋ฉด ์๋์น ์์ ๋์์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ธ ๋ฌธ์ ๋ฅผ ์ด๋- ํธ๋์ญ์ ์ข ๋ฃ ์ Lock ์ด ์๋์ผ๋ก ํด์ ๋์ง ์์ผ๋ฏ๋ก, ๋ณ๋์ ๋ช ๋ น์ด๋ก ๋ฝ ํด์ ์ ์ธ์ ๊ด๋ฆฌ๊ฐ ํ์
์ฌ๋ก.
- ๋ฆฌ์์ค ๋๊ธฐํ โ ๋ณต์์ ํธ๋์ญ์
์ด๋ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ๋ฆฌ์์ค๋ฅผ ๋๊ธฐํํด์ผ ํ ๋ ์ ์ฉ
- ex) ๋ค์์ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ํ์ผ์ ์์ , ๋์ผํ ์ธ๋ถ ์์คํ ์ ์ ๊ทผํ ๋ ์ถฉ๋์ ๋ฐฉ์ง
- ์์ฐจ ์์
์ฒ๋ฆฌ โ ํน์ ์์
์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์์
์ ์์๋ฅผ ๋ณด์ฅ
- ex) ๋ค์์ ํธ๋์ญ์ ์ด ๋์ผํ ์์ ์ ์ํํ๋ ค ํ ๋ ์์ ์ ์์๋ฅผ ์ ์ด
- ๋ค์ค ์๋ฒ ํ๊ฒฝ์์์ ๋๊ธฐํ โ ์ฌ๋ฌ ์๋ฒ๊ฐ ๋์ผํ DB๋ฅผ ์ฌ์ฉํ๋ ํ๊ฒฝ์์, ์๋ฒ ๊ฐ์ ์์
๋๊ธฐํ ๊ฐ๋ฅ
- ex) ์๋ฒ ๊ฐ์ ์์ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ผ๊ด์ฑ์ ์ ์ง
- ์ผํ์ฑ ์์ ๋ณด์ฅ โ ํ ๋ฒ๋ง ์คํ๋์ด์ผ ํ๋ ์์ ์์ ๋์์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์ผํ ์์ ์ ์ํํ์ง ์๋๋ก ๋ณด์ฅ
.
.
๐ ๏ธ ์ฑ๋ฅ ํ ์คํธ.
- ํ์ ์๋: 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์ผ๋ก ์กฐํ๋์ด, ์ฌ๊ณ ๋ถ์กฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
'Web > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋์์ฑ] Kafka Concurrency Control(feat. Redis) (0) | 2024.08.20 |
---|---|
[๋์์ฑ] Redis Concurrency Control(incr, Lettuce, Redisson Lock) (0) | 2024.08.18 |
[๋์์ฑ] Java Concurrency Control(asynchronous, synchronized) (2) | 2024.08.16 |
[Spring] Transaction Propagation (0) | 2024.07.12 |
[Spring] Transactional (0) | 2024.07.03 |