์๋ฐ ๊ธฐ๋ฐ ์น ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉํฐ์ค๋ ๋ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์, ๋์์ฑ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์ ํด๊ฒฐํด์ผ ํ๋ค๊ณ ๋ค์๋ค.
์ด๋ฒ์ ๋ด๊ฐ ํ๋ ์ผํ๋ชฐ ํ๋ก์ ํธ์์๋ ๊ทธ ์ด์๊ฐ ๋ฑ ํฐ์ก๋ค.
์๋ฅผ ๋ค์ด ๋ช ๋ง ๋ช ์ด ํ์ ๋ ์ฌ๊ณ ์ ์ํ์ ์ฃผ๋ฌธํ๋ ค๊ณ ํ ๋?
์๋ง์ ๋ฉํฐ์ค๋ ๋๋ ๋ฐ์ดํฐ์ ์ฌ๊ณ ๋์ ์กฐํํ๋ฉฐ ์ฌ๊ณ ๊ฐ ๋จ์ด์ก์ผ๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํค๋ฉด ๋๋ค.
ํ์ง๋ง ๋์์ ์ ๊ทผํ๋ฉด? ์ด๊ฑฐ ๋๊ฐํ๋ค. ์ด ๋ฌธ์ ์ ๋ํ ๊ณ ์ฐฐ์ ์์ฑํ๊ฒ ๋ค.
DB ๋์์ฑ ๋ฌธ์
๋์์ DB๋ฅผ ์กฐํํ ๋๊ฐ ๋ฌธ์ ์ด๋ค.
๋ด๊ฐ ์ฌ์ฉํ๋ DBMS๋ Mysql
Mysql์ ๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค์ผ๋ก Level 2 Repeatable Read๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ์ธ๋ ์์ญ์ ํตํ ๋ค์ํ ๋ฒ์ ๋ณ MVCC๋ฅผ ํตํด ๋ฒ์ ์ ๋ง๋ ๊ฐ์ ์กฐํํ ์ ์๋ค.
ํ์ง๋ง ๋ชจ๋ ๊ธฐ์ ์ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋ง๋ จ์ด๋ค.
๊ทธ๊ฒ์ ๋ฐ๋ก Phantom Read์ด๋ค.
=> ํ ํธ๋์ญ์ ๋ด์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์ํํ ๊ฒฝ์ฐ, ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ์๋ ์ ๋ น ๋ ์ฝ๋๊ฐ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ๋ํ๋๋ ํ์
์ฐธ์กฐ : https://itpenote.tistory.com/616
Phantom Read
I. Phantom Read ์ ์ ํ ํธ๋์ญ์ ๋ด์์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฒ ์ํ ์, ์ฒซ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ์๋ ๋ ์ฝ๋(์ ๋ น, Phantom)๊ฐ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ์์ ๋ฐ์ํ๋ ํ์ ์ ์ฐจ ์ ์ฐจ ํธ๋์ญ์ ๋ฐ์ดํฐ ์์ ์ค๋ช โ Read Tra
itpenote.tistory.com
๋ด ํ๋ก์ ํธ์์์ DB ๋์์ฑ ๋ฌธ์
์กฐ๊ฑด
=> ์ ๋ง๋ช ์ ์ฌ๋์ด ํ์ ๋ ์ฌ๊ณ ์ ์ํ์ ๊ตฌ๋งคํ๋ ค๊ณ ํ๋ค. ์ด๋ ๋์์ ์ฃผ๋ฌธ ๋ฒํผ์ ๋๋ ์ ๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น? (ํฌํ ๋ฆฌ๋ ๋ฐ์)
์ ์ฐจ
์ฌ๊ณ ๋ ๋ฏฟ์ ์ ์๋ ๊ฐ์ด ๋๋ค.
ํด๊ฒฐ๋ฒ
๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ฝ์ ์ด์ฉํ์
=> ์ฌ๊ณ ๋ฅผ ํ์ธํ๋ ์๊ฐ ๋ฆฌ์์ค๋ฅผ ์ ์ ํ๋ ๊ฒ์ด๋ค. Mysql์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ์ฝ๋ ๋ฝ์ด๋ฏ๋ก, ํด๋น ๋ ์ฝ๋์ ํธ๋์ญ์ ๋์ ๋ฝ์ ์ ์ ํ๋ ๊ฒ์ด๋ค.
์ฟผ๋ฆฌ๋ฅผ ํตํด ๋ฝ ์ ์
=> For Update๋ฅผ ํตํด ํธ๋์ญ์ ์ํ๋์ ๋ฝ์ ํ๋ํด ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์๋ ๋ฆฌ์์ค๋ฅผ ์ ์ ํ๋ค.
@Transactional
public String getkakaoPayUrl(OrderDTO orderDTO, HttpServletRequest request) throws RunOutOfStockException {
/* ์ฌ๊ณ ํ์ธ */
int productStock = productMapper.selectStockOfProduct(orderDTO.getItemName());
if (orderDTO.getQuantity() > productStock) {
throw new RunOutOfStockException("ํด๋น ์ํ์ด ํ์ ๋์์ต๋๋ค.");
}
์๋น์ค ๋ ์ด์ด์์ ํธ๋์ญ์ ์ ๊ฑด๋ค.
/* ์ฌ๊ณ ์ฐจ๊ฐ */
updateStock(productStock - orderDTO.getQuantity(), orderDTO.getItemName(), "product_name");
๊ฐ์ ๋ฉ์๋ ๋ด์ ๋ ๋ค๋ฅธ update ์ฟผ๋ฆฌ => ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ ๋ถ ๋กค๋ฐฑ์ด ๋์ด์ผ ํ๋ค. ํธ๋์ญ์ ์ ์์์ฑ!
์ฅ๋ฐ๊ตฌ๋๋ฅผ ๊ฒฐ์ ํด๋ณด์
๊ธฐ์กด ์ํ ์ฌ๊ณ ๋์ 120๊ฐ ์ฉ์ด๋ค.
์ฑ๊ณตํ ๊ฒฝ์ฐ
=> ๋ ๋ฒ ๊ฒฐ์ ํ์ผ๋ฏ๋ก ์ ๋๋ก ์๋ ์ฐจ๊ฐ์ด ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
ํ์ง๋ง ๋ฝ์ ๊ฑด๋ค๋ ๊ฒ์ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๊ฐ๋ณํ ์ ๊ฒฝ ์จ์ ์ฃผ์ํ๋ฉฐ ์ฌ์ฉํด์ผ ๋ ๊ฒ ๊ฐ๋ค.
์ฑ๋ฅ์ ๊ณ ๋ คํ ๋ฆฌํฉํ ๋ง!! (์ถ๊ฐ)
๋ค์ ๊ธ์ ์ฝ์ด๋ณด์ธ์ ใ ใ
๋์์ฑ ์กฐํ ๋ฌธ์ ํด๊ฒฐ ๋ฐ ์ฑ๋ฅ์ ๊ดํ ๊ณ ๋ฏผ [Lock, Queue, Redis]
์ฃผ๋ฌธ ๊ฑด์ ๋ํ ์ํ ์ฌ๊ณ ํ์ ๋์์ฑ ๊ด๋ จ ์ด์์ ๋ํด ๊ณ ๋ฏผํ ํ๋ฃจ๋ค. ํ๋ก์ ํธ ๋ฆฌํฉํ ๋ง์ ์์ํ๋ฉฐ ์ง๋ ๋๋ฉ์ธ๋ค์ ๊ธฐ๋ณธ crud API๋ง์ ๋ค๋ฃจ์๋ค. 5์ผ๋์ JPA ๊ฐ์๋ค์ ์๊ฐํ๋ฉฐ ๋ณธ๊ฒฉ์ ์ผ๋ก
sweeeetgoguma.tistory.com
'๐ Spring Framework > Spring Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ใOutBox Patternใ ํ์ฉ (0) | 2022.06.10 |
---|---|
2022.06.07 ใํ๋ก์ ํธ ์ค๊ฐ ์ ๊ฒใ (0) | 2022.06.07 |
2022.06.01 ใ๊ฒฐ์ API - Ver.2ใ (2) | 2022.06.01 |
2022.05.29 ใ๊ฒฐ์ APIใ (0) | 2022.05.29 |
2022.05.28 ใ์ฟ ํค ์์ ใ (0) | 2022.05.28 |