์ฐ๋ฅด์ Lock & JPA Lock ๊ฐ์ ์ ๋ฆฌ
๐ก Lock์ด๋?
์ฌ๋ฌ ์ปค๋ฅ์
์ด ๋์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ค๊ณ ํ ๋, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์งํค๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์
๋๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ ๊ถ(lock) ๋๋ฉด,
- ๋ค๋ฅธ ํธ๋์ญ์
์ ์ ๊ทผ ๋ถ๊ฐ
- ์ฐ์ฐ์ด ๋๋๊ณ ์ ๊ธ ํด์ ๋๋ฉด ๋ค๋ฅธ ํธ๋์ญ์
์ด ์ ๊ทผ ๊ฐ๋ฅ
โ
์ฆ, ์๋ฌผ์ ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทธ๊ณ ํธ๋ ๊ณผ์ ์ด Lock!
๐ Lock vs Transaction
| ๊ฐ๋
| ์ค๋ช
|
|---|
| Lock | ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ํ ๋์์ฑ ์ ์ด ์๋จ |
| Transaction | ์์
์ ์์์ฑ ๋ณด์ฅ (all or nothing) |
| ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค (Isolation Level) | ์ฌ๋ฌ ํธ๋์ญ์
๊ฐ ์ํธ ๊ฐ์ญ์ ์ผ๋ง๋ ํ์ฉํ ์ง์ ๋ํ ์ ๋ต |
| ๐ | Lock์ ์ด ๊ฒฉ๋ฆฌ ์์ค์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋ |
โ๏ธ ๋๊ด์ Lock (Optimistic Lock)
โ์ถฉ๋์ด ์ ์ ๋ ๊ฑฐ์ผโ๋ผ๋ ๋๊ด์ ์ธ ๊ฐ์
- ๋ฒ์ ๊ธฐ๋ฐ์ผ๋ก ์ถฉ๋ ํ์ธ
- ํธ๋์ญ์
์ถฉ๋์ด ๋ฐ์ํ ํ์ ์ฒ๋ฆฌ
- Application ์์ค Lock์ด๋ผ๊ณ ๋ ๋ถ๋ฆผ
โ
JPA์์ ์ฌ์ฉํ๊ธฐ
@Version
private Long version;
๐ก ํน์ง
- ์
๋ฐ์ดํธ ์ ๋ฒ์ ๋ถ์ผ์น โก๏ธ ์์ธ ๋ฐ์
- ์ฑ๋ฅ์ ์ ๋ฆฌ (๋ฝ์ ์ก์ง ์์)
- ๋์ ์ถฉ๋ ์ ๋กค๋ฐฑ ๋ฐ ์ฌ์๋ ํ์
๐ฌ ๋น๊ด์ Lock (Pessimistic Lock)
โํญ์ ์ถฉ๋์ด ๋ ๊ฑฐ์ผโ๋ผ๋ ๋น๊ด์ ์ธ ๊ฐ์
- ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์๊ฐ๋ถํฐ ์ ๊ธ
- DB ์์ค Lock
- ๋ํ ์:
SELECT ... FOR UPDATE
โ
JPA์์ ์ฌ์ฉํ๊ธฐ
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select c from Coupon c where c.id = :id")
Optional<Coupon> findByIdForUpdate(Long id);
๐ก ํน์ง
- ๋ค๋ฅธ ํธ๋์ญ์
์ด ์ ๊ทผํ์ง ๋ชปํจ
- ์ ํํ ์ฒ๋ฆฌ ๊ฐ๋ฅํ์ง๋ง ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ
๐งช ์ค์ ์์ โ ์ฟ ํฐ ๋ฐ๊ธ ์๋๋ฆฌ์ค
๐ฏ ๋ชฉํ
- ์ฟ ํฐ ์ด 5๊ฐ
- ๋์์ 20๋ช
์ด ๋ฐ๊ธ ์์ฒญ
๐ Lock ๋ฏธ์ ์ฉ
- 20๋ช
๋ชจ๋ ๋ฐ๊ธ ์ฑ๊ณต โ (๋์์ฑ ๋ฌธ์ )
โ
๋๊ด์ Lock ์ฌ์ฉ
@Version ํ๋๋ก ์ถฉ๋ ๊ฐ์ง
- ๋ฒ์ ์ด ์ผ์นํด์ผ ์
๋ฐ์ดํธ ์ฑ๊ณต
- ์ค์ ๊ฒฐ๊ณผ: 3๊ฐ ๋ฐ๊ธ๋ง ์ฑ๊ณต
โ ๋๋จธ์ง๋ ๋ฒ์ ์ถฉ๋๋ก ์คํจ
โ
๋น๊ด์ Lock ์ฌ์ฉ
@Lock(LockModeType.PESSIMISTIC_WRITE) ์ฌ์ฉ
- ํธ๋์ญ์
ํ๋๊ฐ ์ฒ๋ฆฌ ์ค์ด๋ฉด ๋ค๋ฅธ ํธ๋์ญ์
์ ๋๊ธฐ
- ์ค์ ๊ฒฐ๊ณผ: ์ ํํ 5๊ฐ ๋ฐ๊ธ
๐ค ์ธ์ ์ด๋ค Lock์ ์จ์ผ ํ ๊น?
| ์กฐ๊ฑด | ์ถ์ฒ Lock ๋ฐฉ์ |
|---|
| ์ถฉ๋ ๊ฐ๋ฅ์ฑ ๋ฎ์ | โ
๋๊ด์ Lock |
| ์ถฉ๋ ๊ฐ๋ฅ์ฑ ๋์, ์ ํํ ์ฒ๋ฆฌ ํ์ | โ
๋น๊ด์ Lock |
| ์ฌ์๋ ๋ก์ง์ด ๊ตฌํ๋์ด ์์ | ๋๊ด์ Lock ์ฌ์ฉํด๋ OK |
| ์ฒ๋ฆฌ๋๋ณด๋ค ์ ํฉ์ฑ์ด ๋ ์ค์ | ๋น๊ด์ Lock ๊ณ ๋ ค |
๐ ๋ง๋ฌด๋ฆฌ ์ ๋ฆฌ
| ๊ตฌ๋ถ | ๋๊ด์ Lock | ๋น๊ด์ Lock |
|---|
| ์ถฉ๋ ๊ฐ์ | ์ ์ ๋๋ค | ์์ฃผ ๋๋ค |
| ์ฌ์ฉ ์์น | ์ ํ๋ฆฌ์ผ์ด์
(๋ฒ์ ๊ธฐ๋ฐ) | DB (์ ๊ธ ๊ธฐ๋ฐ) |
| ์ฑ๋ฅ | ์ฐ์ | ๋ฎ์ (ํธ๋์ญ์
๋๊ธฐ) |
| ์ฒ๋ฆฌ ์คํจ ์ | ์์ธ ๋ฐ์, ์ฌ์๋ ํ์ | ํธ๋์ญ์
๋๊ธฐ |
๐ ์ถ์ฒ: ์ค๋ฌด์์๋?
- ๊ธฐ๋ณธ์ ๋๊ด์ Lock ์ฌ์ฉ
- ์ค๋ณต ๋ฐ๊ธ, ์ฌ๊ณ ์ฐจ๊ฐ, ์ ์ฐ์ฒ๋ผ ์ ํฉ์ฑ์ด ์ค์ํ ๋ถ๋ถ์๋
โ ๋น๊ด์ Lock์ ์ ์ฉํ๋ ๊ฒ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค!