ํผ๋๋ก ๋์๊ฐ๊ธฐ
Dev.toDatabase
์๋ฌธ ์ฝ๊ธฐ
Consistent Lock Ordering๊ณผ Retry ๋ฉ์ปค๋์ฆ์ ํตํ PostgreSQL Deadlock ํด๊ฒฐ
Surviving Scale: How to Fix PostgreSQL Deadlocks in Laravel ๐
AI ์์ฝ
Context
B2B SaaS ํ๋ซํผ์ ์ฑ์ฅ์ผ๋ก ์ธํ High Concurrency ์ํฉ์์ Database Transaction์ ๋ฐ์ดํฐ ์ ํฉ์ฑ ์ ์ง ์ค Deadlock ๋ฐ์. ์๋ก ๋ค๋ฅธ Transaction์ด ์ํธ ์์กด์ ์ธ Row Lock์ ์ ์ ํ๋ฉฐ API ์์ฒญ ์คํจ์ 500 Server Error๋ฅผ ์ ๋ฐํ๋ ์ํคํ ์ฒ์ ํ๊ณ ๋ ธ์ถ.
Technical Solution
- ๋ฌด์์ Lock ์์๋ก ์ธํ ๊ต์ฐฉ ์ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Row ID ๊ธฐ๋ฐ์ ์ผ๊ด๋ Lock ์์ ๊ฐ์ ์ค๊ณ
- min/max ํจ์๋ฅผ ํตํด ํญ์ ๋ฎ์ ID์ Row๋ฅผ ๋จผ์ Lock ํ์ฌ ์ํ์ ์ผ๋ก Deadlock ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ ๊ฑฐํ Consistent Lock Ordering ์ ์ฉ
- ์ธ๋ฑ์ค ์ ๋ฐ์ดํธ๋ ๋ณต์กํ Cascade ์์ ์ค ๋ฐ์ํ๋ ์ผ์์ Deadlock ๋์์ ์ํด Laravel์ Transaction Retry Helper ๋์
- DB::transaction์ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ํตํด ์ง์ ํ์๋งํผ ์๋ ์ฌ์๋ ๋ก์ง์ ๊ตฌ์ฑํ์ฌ ์์คํ ํ๋ณต ํ๋ ฅ์ฑ ํ๋ณด
- ๋จ์ํ ์์ธ ์ฒ๋ฆฌ๊ฐ ์๋ Transaction ์ ์ฒด ๋จ์๋ฅผ ์ฌ์คํํจ์ผ๋ก์จ ๋ฐ์ดํฐ ์ผ๊ด์ฑ๊ณผ ๊ฐ์ฉ์ฑ์ ๋์์ ํ๋ณดํ ๊ตฌ์กฐ
์ค์ฒ ํฌ์ธํธ
1. ๋ค์ค Row ์ ๋ฐ์ดํธ ์ ID ๊ธฐ๋ฐ ์ ๋ ฌ ํ Lock์ ํ๋ํ๋ ์์ ์ ์ด ๋ก์ง ๊ตฌํ ์ฌ๋ถ ๊ฒํ
2. ์์ธก ๋ถ๊ฐ๋ฅํ Transient Deadlock ๋ฐ์ ์ง์ ์ ๋ํด ์ ์ ํ Retry ํ์(์: 3ํ) ์ค์ ์ ์ฉ
3. lockForUpdate() ์ฌ์ฉ ์ ๋ฐ์ํ ์ ์๋ ์ ๊ธ ๋ฒ์์ ํธ๋์ญ์ ์ ์ง ์๊ฐ ์ต์ ํ