๐ ํด๊ฒฐ ๋ฐฉ๋ฒ: ๋ฝ ์์ ๊ณ ์ (Lock Ordering)
๐ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉํฅ
์๋ก ๋ค๋ฅธ ์ ์ ๊ฐ ๊ต์ฐจ ์ก๊ธ(A→B, B→A)์ด ๋์์ ๋ฐ์ํ ๊ฒฝ์ฐ,
๊ฐ ์ฐ๋ ๋๊ฐ ๋ฝ์ ๊ฑฐ๋ ์์๊ฐ ์๊ฐ๋ฆฌ๋ฉด ๋ฐ๋๋ฝ์ด ๋ฐ์ํ ์ ์์ด.
์์
- ์ฐ๋ ๋ 1: A → B ์ก๊ธ → A ๊ณ์ข ๋ฝ → B ๊ณ์ข ๋ฝ
- ์ฐ๋ ๋ 2: B → A ์ก๊ธ → B ๊ณ์ข ๋ฝ → A ๊ณ์ข ๋ฝ
→ ์๋ก ๋ฝ์ ์ ์ ํ ์ํ์์ ์๋ ๋ฝ์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ์์ํ ๋๊ธฐ = ๐ฅ ๋ฐ๋๋ฝ ๋ฐ์
๊ทธ๋์ ์ฐ๋ฆฌ๋ ํญ์ ๋ฝ์ ๊ฑฐ๋ ์์๋ฅผ ๊ณ ์ ํ์ด.
userId๊ฐ ๋ฎ์ ๊ณ์ข → ๋์ ๊ณ์ข ์์ผ๋ก ๋ฝ์ ํ๋ํ๋๋ก ํด์
๋ฝ ์์๊ฐ ์ผ๊ด๋๋๋ก ๋ณด์ฅํ์ด.
๐ ๋ฝ ์์ ๊ณ ์ ํ๋ฆ
- ๋ ์ ์ ID๋ฅผ ๋น๊ตํด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
- SELECT ... FOR UPDATE๋ก ๋ฎ์ ID ๊ณ์ข๋ถํฐ ๋ฝ์ ๊ฑด๋ค
- ๋๋จธ์ง ๊ณ์ข์ ๋ํด ๋์ผํ๊ฒ ๋ฝ์ ๊ฑด๋ค
- ํธ๋์ญ์ ๋ด์์ ์์ ํ๊ฒ ํฌ์ธํธ ์ด์ฒด ์ํ

์ด๋ ๊ฒ ๋ฝ ์์๋ฅผ ๊ณ ์ ํ๋ฉด,
๊ต์ฐจ ์ก๊ธ์ด ๋ฐ์ํ๋๋ผ๋ ์ฐ๋ ๋๋ค์ด ํญ์ ๋์ผํ ์์๋ก ๋ฝ์ ์ก๊ธฐ ๋๋ฌธ์
๋ฐ๋๋ฝ ์์ด ์์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ด.
๐ก ๋์ ํ ๊ฐ์ ์
ํญ๋ชฉ | Before | After |
๋ฝ ํ๋ ์์ | ์ฐ๋ ๋๋ง๋ค ๋ฌ๋ผ ๋ฐ๋๋ฝ ๊ฐ๋ฅ์ฑ ์์ | ํญ์ ๊ณ ์ ๋ ์์๋ก ๋ฝ ํ๋ |
๋ฐ๋๋ฝ ๋ฐ์ ๊ฐ๋ฅ์ฑ | ๋์ | ์ ๋ก |
๊ต์ฐจ ์ก๊ธ ์์ ์ฑ | ๋ถ์์ | ์์ ํ๊ฒ ์ฒ๋ฆฌ๋จ |
๐ ์ด๋์ ์ฐ์ด๋?
- A ↔ B ๊ต์ฐจ ์ก๊ธ
- ์ฌ์ฉ์ ๊ฐ ์๊ฐ ๊ธฐ๋ฐ ํฌ์ธํธ ๊ตํ (ํ์๋ฑ ํฌ ์คํ์ผ)
- ์ฌ๊ณ ์ฐจ๊ฐ ์ ์ฃผ๋ฌธ์๊ฐ ๋ค๋ฅผ ๋
- ๋์ผ ๋ฆฌ์์ค๋ฅผ ๋ค์์ ์์ฒญ์ด ๋์์ ์ ๋ฐ์ดํธํ ๋
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ธฐ๋ณธ CRUD๋ง ์ธ ๊ฑฐ๋ฉด JpaRepository๋ง ์ฐ๋ฉด ๋์ง, ์ ๋ Impl์ ์ธ๊น? (0) | 2025.04.15 |
---|---|
kafka๋ฅผ ํตํ ๋๊ท๋ชจํธ๋ํฝ ๋ฐ ๋์์ฑ ์ ์ด (0) | 2025.04.06 |
๋น๊ด์ ๋ฝ(Pessimistic Lock) ๋์ (0) | 2025.04.05 |
ํฌ์ธํธ ์ก๊ธ ์์คํ ์์์ ๋์์ฑ ์ฒ๋ฆฌ ๋ฐ ๋ฐ๋๋ฝ ์ด์ (0) | 2025.04.05 |
RabbitMQ ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ํคํ ์ฒ ๋์ ์ฑ๋ฅ ๊ฐ์ ์ฌ๋ก (0) | 2025.04.02 |