์ด์ ์ํฉ
์งํํ๊ณ ์๋ ํ๋ก์ ํธ์ '๋๋ง์๊ธฐ' ๊ธฐ๋ฅ์ ์ ๊ณต์ค์ด๋ค.
์์ธ์ฒ๋ฆฌ๊ฐ ์ ์ฉ๋์ง ์๊ณ ๋๊ฐ์ ๋จ์ด๊ฐ ๋์์ ์ฝ์ ๋์๋ค!
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
์ฐ์ Chatgpt๋ฅผ ์ด์ฉํด์ ํด๋น ์ฌํญ์ ๋ํด ๋ฌผ์ด๋ณด์๋ค.
1. ๊ฒฉ๋ฆฌ์์ค ์ค์ ์ ๊ณ ๋ ค -> ํ๋ฝ
์ฐ์ PostgreSQL์์๋ 4๊ฐ์ง์ Transaction ๊ฒฉ๋ฆฌ ์์ค์ ์ค์ ํ ์ ์๋ค.
๋๋ง์๊ธฐ์ ์ ์ฉํ๋ ๊ฒ์ ์๊ฐํด๋ดค์๋, ํ๋์ transaction์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์๋, ๋ค๋ฅธ transaction์์ ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ ์ฝ์ด์ผํจ.
Postgresql์ Read Uncommited๋ฅผ ์ง์ํ์ง ์๋๋ค๊ณ ํ๋ค! ๊ฒฐ๋ก ์ ์ผ๋ก DirtyRead๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
2. ๋๊ด์ ๋ฝ๊ณผ ๋น๊ด์ ๋ฝ ๊ณ ๋ คํ๊ธฐ (์ค ๊ด์ฐฎ๋ค!)
๋๊ด์ ๋ฝ๊ณผ ๋น๊ด์ ๋ฝ์ ์ฌ์ฉํ๋ ๊ธฐ์ค์ "๋์์ ์์ ์ ํ๋์ผ์ด ๋น๋ฒํ๊ฒ ์ผ์ด๋๋๊ฐ ?"
๋น๊ด์ ๋ฝ(Pessimistic Lock)
๋ฐ๋ผ์ ํ๋์ ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์์ ์์ ๋ฝ(Lock)์ ๊ฑธ๊ณ , ์กฐํ ๋๋ ๊ฐฑ์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ๋๊น์ง ์ ์งํฉ๋๋ค. SELECT...FOR UPDATE๋ก ์กฐํ๋ ํด๋น ๋ก์ฐ๋ ์ ๊ธ์ ํ๋ํ์ฌ ํด๋น ํธ๋์ญ์ ์ด ๋๋๊ธฐ ์ ๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ ๊ทผํ์ง ๋ชปํ๊ณ ๋๊ธฐํด์ผ ํฉ๋๋ค. ๋๊ธฐ ์๊ฐ์ ์ค ์ ์๋ค.
๊ณต์ ์์์ ์ฌ์ฉํ ๋ ๋ค๋ฅธ ์ฐ๋ ๋์ ์ถฉ๋์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ทธ์ ๋ฐ๋ผ ๊ณต์ ์์์ ๋ํ ๋ฝ์ ๊ฑธ์ด ๋ค๋ฅธ ์ฐ๋ ๋์ ๋ํ ์ ๊ทผ์ ๋ง๋ ๋ฐฉ์์ ๋๋ค. ๋ฐ๋ผ์, ์ถฉ๋์ด ๋น๋ฒํ๊ฒ ์ผ์ด๋๋ ํ๊ฒฝ์์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํจ๊ณผ์ ์ผ ์ ์์ต๋๋ค.
๋๊ด์ ๋ฝ(Optimistic Lock)
์ถฉ๋์ด ๋ฐ์ํ์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ ํ๊ณ ๊ทธ์ ๋ฐ๋ผ ๊ณต์ ์์์ ๋ํ ๋ฝ์ ๊ฑธ์ง ์๊ณ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ง์ฝ, ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์ด๋ฏธ ๋ฝ์ ๊ฑธ์ด๋์ ๊ฒฝ์ฐ์๋ ๋๊ธฐํ๋ค๊ฐ ๋ฝ์ด ํ๋ฆฌ๋ฉด ์์์ ๋ํ ์ ๊ทผ์ ์๋ํฉ๋๋ค.
์ค๋ฌด์์ ๊ตฌ์ฒด์ ์ธ ์์๋ฅผ ๋ค๋ฉด, ๋๊ด์ ๋ฝ์ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๊ธฐ ๋น์จ์ด ๋์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฒ์๊ธ์ ์ฝ๋ ์ฐ๋ ๋๊ฐ ๋ค์ ์กด์ฌํ๊ณ , ์ฐ๊ธฐ ์์ ์ ๋น๊ต์ ๋๋ฌผ๊ฒ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ ๋๊ด์ ๋ฝ์ด ํจ๊ณผ์ ์ผ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์, ์ฐ๊ธฐ ์์ ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ ๋น๊ด์ ๋ฝ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
3. ๋ถ์ฐ ๋ฝ ์ฌ์ฉ -> ํ๋ฝ
๋ถ์ฐ์์คํ ์์ ์ฌ๋ฌ ์๋ฒ๊ฐ์ ๊ณต์ ์์์ ๋ํ ๋์ ์ ๊ทผ์ ์ ์ดํ๊ธฐ ์ํด ๋ถ์ฐ ๋ฝ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค.
๋์ ํ๋ก์ ํธ๋ ๋ถ์ฐ์์คํ ์ด ์๋๊ณ ๋จ์ผ ์๋ฒ์ด๊ธฐ์ ํ๋ฝ.
4. ์บ์ ์ฌ์ฉ -> ๋ณด๋ฅ
์บ์๋ฅผ ํ์ฉํด์ ์ค๋ณต๋จ์ด๋ฅผ ์ฒดํฌํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด๋ณผ ์ ์๊ฒ ๋ค. DB์กฐํ๋ฅผ ์ค์ด๊ณ , ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ.
HashMap ๋๋ Redis์ ๊ฐ์ ์ธ๋ถ ์บ์๋ฅผ ์ด์ฉํ๋๊ฒ์ ๊ณ ๋ คํด๋ณผ ์ ์๊ฒ ๋ค. ์ค์ ํ๋ก๋์ ํ๊ฒฝ์ด๊ธฐ์ Redis์ ๊ฐ์ ์ธ๋ถ ์บ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ํฉํ๋ค๊ณ ๊ณ ๋ ค๋จ. ์บ์ ์ฌ์ฉ์ผ๋ก ์ธํด์ ํด๊ฒฐ์ด ๋ ๋ฌธ์ ์ธ๊ฐ?! ์์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค. ์ฐ์ ๋ณด๋ฅ
๋ฝ(Locking)์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฒฉ๋ฆฌ ์์ค(Isolation Level) ์ค์ ์ ์ฅ๋จ์
์ธก๋ฉด | ๋ฝ(Locking) | ๊ฒฉ๋ฆฌ ์์ค ์ค์ |
์ ์ด ์ ๋ | ๋์ | ๋ฎ์ |
๋ณต์ก์ฑ | ๋์ | ๋ฎ์ |
์ฑ๋ฅ ์ํฅ | ๋์ (Lock Contention ๊ฐ๋ฅ) | ๋ฎ์ |
๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ณด์ฅ | ๊ฐ๋ฅ | ๋ณด์ฅ (์ค์ ์ ๋ฐ๋ผ ๋ค๋ฆ) |
๋ฐ๋๋ฝ ๋ฐ์ ๊ฐ๋ฅ์ฑ | ๋์ (์ ์ ํ ๊ด๋ฆฌ ํ์) | ๋ฎ์ (์ผ๋ฐ์ ์ผ๋ก ์์คํ ์ด ์ฒ๋ฆฌ) |
๋์์ฑ ์ ์ด | ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ตฌํํด์ผ ํจ | ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์์ ์ฒ๋ฆฌ |
์ ์ฐ์ฑ | ๋์ (ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ) | ๋ฎ์ (์ผ๋ฐ์ ์ผ๋ก ์ค์ ๋ณ๊ฒฝ์ผ๋ก ์ฌ์ฉ) |
'Server๐งค > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] Java Persistence API (0) | 2023.06.12 |
---|---|
[SpringDataJPA] save(), saveAll() ์ฐจ์ด (0) | 2023.05.14 |
[JPA] ํ๋ก์ (0) | 2023.02.24 |
[JPA] ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ (0) | 2023.02.03 |
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ (๋จ๋ฐฉํฅ ๋งคํ) (0) | 2023.02.03 |