DB Concurrency Issue
๋์์ฑ ๋ฌธ์
[์ํฉ: ํ๊ธธ๋ ๊ณ์ข ์์ก 10,000์] (Lost Update)
ํธ๋์ญ์ A: 3,000์ ์ ๊ธ ์๋. (DB ์กฐํ: 10,000์ -> ๋ฉ๋ชจ๋ฆฌ์์ +3,000 = 13,000์)
ํธ๋์ญ์ B: 5,000์ ์ ๊ธ ์๋. (DB ์กฐํ: 10,000์ -> ๋ฉ๋ชจ๋ฆฌ์์ +5,000 = 15,000์)
ํธ๋์ญ์ A ์ปค๋ฐ: DB์ 13,000์ ์ ์ฅ.
ํธ๋์ญ์ B ์ปค๋ฐ: DB์ 15,000์ ์ ์ฅ. (13,000์์ ๋ฎ์ด์)
๊ฒฐ๊ณผ: ์ต์ข ์์ก์ 15,000์์ ๋๋ค. ํธ๋์ญ์ A๊ฐ ์ ๊ธํ 3,000์์ ์ฌ๋ผ์ก์ต๋๋ค.
๋ ํธ๋์ญ์ ์ด ๋ชจ๋ ์ฑ๊ณต์ ์ผ๋ก ์ปค๋ฐ์ ํ๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๊นจ์ก์ต๋๋ค.
์ฐจ๋ผ๋ฆฌ ์ด๋๊ฐ ์ฅ์ ๊ฐ ๋ฐ์ํด ์์ธ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ์ธ์งํ ์ ์๋ ์ฆ์์ด ์์๋ค๋ฉด ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ์ธ์งํ๊ณ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณผ ์ ์๊ฒ ์ง๋ง, ๋ค๋ฆ๊ฒ ๋ฐ๊ฒฌํ ๊ฒฝ์ฐ ์ด๋ฏธ ์ผ๊ด์ฑ์ด ๋ง์ด ๊นจ์ ธ์์ด์ ๊นจ์ง ์ผ๊ด์ฑ์ ๋ง์ถ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ด ๋ ์ ์์ต๋๋ค.
์ด ์ธ์๋ ๋ค์ํ ๋์์ฑ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค.
Dirty Read
ํ ํธ๋์ญ์ ์ด ์์ง ์ปค๋ฐ๋์ง ์์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ํ์. ๋ฐ์ดํฐ๋ฅผ ์์ ํ ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋ ๊ฒฝ์ฐ, ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋จ.
Non-Repeatable Read
ํ ํธ๋์ญ์ ๋ด์์ ๋์ผํ ํ(Row)๋ฅผ ๋ ๋ฒ ์ด์ ์กฐํํ์ ๋, ๊ทธ ์ฌ์ด์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ํด๋น ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ์ปค๋ฐํ์ฌ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๋ํ๋๋ ํ์.
Phantom Read
ํ ํธ๋์ญ์ ๋ด์์ ํน์ ๋ฒ์๋ฅผ ๋ ๋ฒ ์ด์ ์กฐํํ์ ๋, ๊ทธ ์ฌ์ด์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ํด๋น ๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ/์ญ์ ํ๊ณ ์ปค๋ฐํ์ฌ ๊ฒฐ๊ณผ ์งํฉ์ด ๋ฌ๋ผ์ง๋ ํ์.
Lost Update
๋ ๊ฐ ์ด์์ ํธ๋์ญ์ ์ด ๋์ผ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์์ ํ ๋, ๋์ค์ ์ปค๋ฐํ ํธ๋์ญ์ ์ ์์ ๋ด์ฉ์ด ๋จผ์ ์ปค๋ฐํ ํธ๋์ญ์ ์ ์์ ๋ด์ฉ์ ๋ฎ์ด์จ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ ์ค๋๋ ํ์
ํด๊ฒฐ์ฑ
: ๊ฒฉ๋ฆฌ ์์ค (Isolation Level) ์กฐ์
READ UNCOMMITTED
O
O
O
- ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ฒ์ ํ์ฉ - ์ ํฉ์ฑ ๋ฌธ์ ๊ฐ ๋ง์ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์
READ COMMITTED
X
O
O
- ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ง ์ฝ๋๋ก ํ์ฌ ๋ํฐ ๋ฆฌ๋๋ฅผ ๋ฐฉ์ง. - ๋๋ถ๋ถ ์์ฉ DB์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค
REPETABLE READ
X
X
O
- ํธ๋์ญ์ ์ด ์์๋ ์์ ์ ๋ฐ์ดํฐ ์ค๋ ์ท์ ์ฝ์ด, ํธ๋์ญ์ ๋ด๋ด ์ผ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฅ. - ๋ ผ ๋ฆฌํผํฐ๋ธ ๋ฆฌ๋๋ฅผ ๋ฐฉ์ง. - MySQL InnoDB์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค
SERIALIZABLE
X
X
X
- ๊ฐ์ฅ ์๊ฒฉํ ์์ค์ผ๋ก, ํธ๋์ญ์ ์ ์์๋๋ก ์คํ์์ผ ๋ชจ๋ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์ง. - ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ๊ฐ์ฅ ๋ฎ์ ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ.
๊ฒฉ๋ฆฌ ์์ค๊ณผ ์ฑ๋ฅ์ ํธ๋ ์ด๋ ์คํ ๊ด๊ณ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์คํ ์ค์ธ ํธ๋์ญ์ ์ ์ด๋ ์ ๋์ ๊ฒฉ๋ฆฌ ์์ค์ด ํ์ํ์ง ๋ฐ์ ธ๋ด์ผ ํฉ๋๋ค.
ํด๊ฒฐ์ฑ
: Pessimistic Lock
๋น๊ด์ ๋ฝ
๊ฐ๋ : "์ถฉ๋์ด ๋ฌด์กฐ๊ฑด ๋ฐ์ํ ๊ฑฐ์ผ"๋ผ๊ณ ๋น๊ด์ ์ผ๋ก ์๊ฐํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋๋ถํฐ ์์ ๋ฝ์ ๊ฑธ์ด๋ฒ๋ฆฝ๋๋ค.
SQL:
SELECT ... FOR UPDATE์ฟผ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค.๋์: ํธ๋์ญ์ A๊ฐ ํ๊ธธ๋ ๊ณ์ข๋ฅผ ์กฐํํ๋ ์๊ฐ ๋ฝ์ ํ๋ํฉ๋๋ค. ํธ๋์ญ์ B๋ A๊ฐ ๋๋ ๋๊น์ง ์กฐํ๋ฅผ ๋ชป ํ๊ณ ๋๊ธฐ(Waiting) ์ํ๊ฐ ๋ฉ๋๋ค.
์ฅ์ : ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ํ์คํ๊ฒ ๋ณด์ฅํฉ๋๋ค.
๋จ์ : ๋๊ธฐ ์๊ฐ์ด ๊ธธ์ด์ ธ์ ์ฑ๋ฅ ์ ํ๋ **
๋ฐ๋๋ฝ(Deadlock)**์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
Last updated