1๏ธโฃTransaction ์ด๋?
Transaction์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์์ ์ํ๋๋ ์์
์ ์ต์ ๋จ์๋ก, ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ฉฐ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.
Transaction์ ํ๋ ์ด์์ query๋ฅผ ํฌํจํด์ผ ํ๊ณ , ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด์๋ ACID ์์น์ ๋ง์กฑํด์ผ ํฉ๋๋ค.
ACID ์์น์ด๋?
์์์ฑ, ์ผ๊ด์ฑ, ๊ณ ๋ฆฝ์ฑ, ์ง์์ฑ 4๊ฐ์ง ๊ท์น
1. ์์์ฑ (Atomicity)
Transaction์ ํฌํจ๋ ์์ ์ ์ ๋ถ ์ํ๋๊ฑฐ๋ ์ ๋ถ ์ํ๋์ง ์์์ผ ํฉ๋๋ค. (== All Or Nothing)
2. ์ผ๊ด์ฑ (Consistency)
Transaction์ด ์คํ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ๋ฉด ์คํ ์ ๊ณผ ํ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ์ ์ง๋์ด์ผ ํฉ๋๋ค.
3. ๊ณ ๋ฆฝ์ฑ (Isolation)
์ฌ๋ฌ Transaction์ด ๋์์ ์คํ๋ ๋, ์๋ก ๊ฐ์ญํ์ง ์์์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ๊ฐ Transaction์ ๋ค๋ฅธ Transaction์ ์ฐ์ฐ ์์
์ด ๋ผ์ด๋ค์ง ๋ชปํ๋๋ก ๋ณด์ฅํ์ฌ ๋
๋ฆฝ์ ์ผ๋ก ์์
์ ์ํํด์ผ ํ๋ฉฐ, ๋์์ ์ํ๋๋ Transaction์ด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ถฉ๋ํ์ง ์๋๋ก ์ ์ดํด์ค์ผ ํฉ๋๋ค. (๋์์ฑ ์ ์ด)
4. ์ง์์ฑ (Durability)
์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ Transaction์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์์ํ ๋ฐ์๋์ด์ผ ํฉ๋๋ค.
์ฆ, Transaction์ด ์๋ฃ๋์ด ์ ์ฅ๋ ํ์๋ ์ ์ , ์ฅ์ , ์ค๋ฅ ๋ฑ์ ์ํฅ์ ๋ฐ์ง ์์์ผ ํฉ๋๋ค.
-- ์์
์ํ ๊ณ์ข ์ด์ฒด๋ฅผ ํ๋ ์ํฉ
A๊ฐ ์์ ์ ๊ณ์ข์์ B์๊ฒ 100๋ง์์ ์ก๊ธํ๋ค.
-- 1. A์ ๊ณ์ข์์ 100๋ฌ๋ฌ ์ฐจ๊ฐ
UPDATE accounts SET balance = balance - 100 WHERE user_id = 'A';
-- 2. B์ ๊ณ์ข์ 100๋ฌ๋ฌ ์ถ๊ฐ
UPDATE accounts SET balance = balance + 100 WHERE user_id = 'B';
-- 3. ํธ๋์ญ์
์ปค๋ฐ
COMMIT;
1. ์์์ฑ
3๋จ๊ณ๊ฐ ๋ชจ๋ ์ฑ๊ณตํ๊ฑฐ๋ ํ๋๋ผ๋ ์คํจํ๋ฉด ์ ๋ถ ๋กค๋ฐฑ๋์ด์ผ ํ๋ค. (All Or Nothing.)
=> A์ ๋์ด ๋น ์ ธ๋๊ฐ๋๋ฐ ์ค๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ฒจ์ B์ ๊ณ์ข์ ์
๊ธ๋์ง ์๋ ์ํฉ์ด ๋ฐ์ํ๋ฉด ์๋๋ค.
๋ฐ๋ผ์ TRANSACTION์ ์ฌ์ฉํ์ฌ ์ ์ฒด ์์
์ ํ๋์ ๋จ์๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
2. ์ผ๊ด์ฑ
ํธ๋์ญ์ ์ํ ์ ๊ณผ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํญ์ ๋ฌด๊ฒฐ์ฑ ๊ท์น์ ์ ์งํด์ผ ํ๋ค.
=> A์ ๊ณ์ข์์ 100๋ง์์ด ๋น ์ ธ๋๊ฐ๋ค๋ฉด, B์ ๊ณ์ข์๋ ๋ฐ๋์ 100๋ง์์ด ์ถ๊ฐ๋์ด์ผ ํ๋ค.
=> ๋ฐ๋ผ์ ํธ๋์ญ์
์ด ์์ ํ ์ํ์ผ ๋๋ง DB์ ๋ฐ์๋์ด์ผ ํ๋ค.
3. ๊ฒฉ๋ฆฌ์ฑ
๊ฐ ํธ๋์ญ์ ์ ์๋ก ๊ฐ์ญํ์ง ์์์ผ ํ๋ค.
=> A๊ฐ B์๊ฒ 100๋ง์์ ์ก๊ธํ๋ ๋์์ ๋ค๋ฅธ ํธ๋์ญ์
์ด A์ ์์ก์ ์กฐํํ๋ค๋ฉด, ์ก๊ธ์ด ์๋ฃ๋๊ธฐ ์ ๊น์ง๋ ๋ณ๊ฒฝ๋ ์์ก์ด ์กฐํ๋๋ฉด ์๋๋ค.
=> ํธ๋์ญ์
๊ฒฉ๋ฆฌ ์์ค ์ค์ ์ ํตํด ํด๊ฒฐํ ์ ์๋ค.
(๊ฒฉ๋ฆฌ ์์ค์ด ๋ฎ์์๋ก ๋ค๋ฅธ ํธ๋์ญ์
์ด ์ปค๋ฐ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๊ณ , ๊ทธ ๋๋ Dirty Read ๊ฐ ๋ฐ์ํ๋ค.)
4. ์ง์์ฑ
ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์๋ ํ์๋, DB์ ๊ทธ ๊ฐ์ด ๊ทธ๋๋ก ์ ์ง๋์ด์ผ ํ๋ค.
=> A๊ฐ B์๊ฒ 100๋ง์์ ์ก๊ธํ ํ, ์๋ฒ๊ฐ ๋ค์ด๋์ด๋ ์ก๊ธ ๋ด์ญ์ ์์ค๋์ง ์์์ผ ํ๋ค.
=> DB๋ ์ปค๋ฐ์ด ์๋ฃ๋๋ฉด ์ฆ์ ๋์คํฌ์ ์ ์ฅํด์ผ ํ๋ฉฐ(WAL), ์ฅ์ ๋ฐ์ ์์๋ ๋ก๊ทธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํด์ผ ํ๋ค.
ACID ์์น์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋์์ฑ ์ ์ด, ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค, MVCC ๋ฑ์ ํ์ฉํ๋ค.
2๏ธโฃ๋์์ฑ ์ ์ด (Concurrency Control)
๋์์ฑ ์ ์ด๋ ํธ๋์ ์ ์ด ๋์์ ์ํ๋ ๋ ์ผ๊ด์ฑ์ ํด์น์ง ์๋๋ก ํธ๋์ ์ ์ ๋ฐ์ดํฐ ์ ๊ทผ์ ์ ์ดํ๋ DBMS์ ๊ธฐ๋ฅ์ ๋๋ค.
๋์์ฑ ์ ์ด ๊ธฐ๋ฒ ์ค ๋ํ์ ์ธ ๊ฒ์ด ๋น๊ด์ ๋ฝ๊ณผ ๋๊ด์ ๋ฝ์ ๋๋ค. ์ด ์ธ์๋ MVCC์ ํ์์คํฌํ ๊ธฐ๋ฒ ๋ฑ์ด ์กด์ฌํฉ๋๋ค.
1. ๋น๊ด์ ๋ฝ (Pessimistic Lock)
๋น๊ด์ ๋ฝ์ด๋ ๋ค๋ฅธ ํธ๋์ญ์
์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค๊ณ ๊ฐ์ ํ๊ณ , ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์ ์ ํํฉ๋๋ค.
์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์์ ํ๊ธฐ ์ ์ ๋ฝ์ ๊ฑธ์ด ๋ค๋ฅธ ํธ๋์ญ์
์ด ์ ๊ทผํ์ง ๋ชปํ๋๋ก ํฉ๋๋ค.
- ์์ : ์ํ ๊ณ์ข ์ด์ฒด, ์ข์ ์์ฝ ์์คํ ๋ฑ
-- ์ฅ์
- ์ถฉ๋์ ๋ฐฉ์งํ์ฌ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ด ๋ณด์ฅ๋ฉ๋๋ค.
-- ๋จ์
- ๋ฝ์ด ๊ฑธ๋ฆฐ ๋์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ๋๊ธฐํ๋ฏ๋ก ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
2. ๋๊ด์ ๋ฝ (Optimistic Lock)
๋๊ด์ ๋ฝ์ด๋ ๋ค๋ฅธ ํธ๋์ญ์
์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๊ฐ๋ฅ์ฑ์ด ์ ๋ค๊ณ ๊ฐ์ ํ๊ณ , ๋ฐ์ดํฐ ์์ ์ ์ถฉ๋ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ ๋ฐฉ์์
๋๋ค.
์ฃผ๋ก ๋ฐ์ดํฐ ์กฐํ ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅํ ๋, ๋ฒ์ ์ด๋ ํ์์คํฌํ๋ฅผ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ ์ถฉ๋ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
- ์์: ๊ฒ์ํ ๊ธ ์์ , ์ผํ๋ชฐ ์ฌ๊ณ ๊ด๋ฆฌ
-- ์ฅ์
- ๋์์ฑ์ด ๋์ ํ๊ฒฝ์์ ์ฑ๋ฅ์ด ์ข์ต๋๋ค.
-- ๋จ์
- ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ํธ๋์ญ์ ์ ๋ค์ ์ํํด์ผ ํ๋ฏ๋ก ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
3. MVCC (Multi-Version Concurrency Control, ๋ค์ค ๋ฒ์ ๋์์ฑ ์ ์ด)
MVCC๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋์์ฑ์ ๋์ด๊ณ ๋ฝ ์์ด ์ฝ๊ธฐ ์์ ์ ์ํํ ์ ์๋๋ก ์ค๊ณ๋ ๊ธฐ๋ฒ์ ๋๋ค.
๋น๊ด์ ๋ฝ๊ณผ ๋๊ด์ ๋ฝ๊ณผ ๋ฌ๋ฆฌ,
ํธ๋์ญ์
๋ง๋ค ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๋ฒ์ ์ ๊ด๋ฆฌํ์ฌ ๋์์ฑ์ ํ๋ณดํ๋ ๋ฐฉ์์
๋๋ค.
MVCC๋ ๋ฝ ์์ด ๋์์ฑ์ ์ต๋ํ ํ๋ณดํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ข์ ์ ํ์ ๋๋ค.
-- ๋์ ๋ฐฉ์
1) ์ฝ๊ธฐ ์์
- ๊ฐ ํธ๋์ญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋, ํด๋น ํธ๋์ญ์ ์ด ์์๋ ์์ ์ ๋ฐ์ดํฐ ๋ฒ์ ์ ์กฐํํฉ๋๋ค.
2) ์ฐ๊ธฐ ์์
- ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๊ฒฝ์ฐ, ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ก์ด ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ์๋ก์ด ๋ฒ์ ์ด ์๋, ์์ ์ ํธ๋์ญ์ ์ด ์์๋ ๋น์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
3) ์ญ์ ์์
- ๋ฐ์ดํฐ ์ญ์ ์ ์ฆ์ ์ญ์ ํ์ง ์๊ณ , ๋ ผ๋ฆฌ์ ์ธ ์ญ์ ์ํ๋ก ์ ์งํฉ๋๋ค.
- ์ดํ ๋ถํ์ํ ๋ฒ์ ์ด ์ ๋ฆฌ๋ฉ๋๋ค. (Garbage Collection)
-- ์ฅ์
- ์ฝ๊ธฐ ์์ ์ ๋ฝ์ด ํ์์๊ธฐ ๋๋ฌธ์ ๋์ ๋์์ฑ์ ์ง์ํฉ๋๋ค.
- ์ฝ๊ธฐ์ ์ฐ๊ธฐ๊ฐ ์ถฉ๋ํ์ง ์์ ๋น๊ด์ ๋ฝ๋ณด๋ค ์ฑ๋ฅ์ด ์ฐ์ํฉ๋๋ค.
- ์ฝ๊ธฐ ์์ ์ค ๋๊ธฐ ์๊ฐ์ด ์์ด ๋น ๋ฅธ ๋ฐ์ดํฐ ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
-- ๋จ์
- ๋ฒ์ ๊ด๋ฆฌ๋ก ์ธํ ์คํ ๋ฆฌ์ง ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๊ณ , ๋ถํ์ํ ๋ฐ์ดํฐ ์ ๋ฆฌ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ํฉ๋๋ค.
- ๊ทธ๋ก ์ธํ ์ ๋ฆฌ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค.
3๏ธโฃTransaction ๊ฒฉ๋ฆฌ ์์ค
ํธ๋์ ์ ๊ฒฉ๋ฆฌ ์์ค์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋์์ ์คํ๋๋ ์ฌ๋ฌ ํธ๋์ ์ ๊ฐ์ ๋ ๋ฆฝ์ฑ์ ๋ณด์ฅํ๋ ์ ๋์ ๋๋ค.
์ฆ, ์ฌ๋ฌ ํธ๋์ ์ ์ด ๋์์ ์ํ๋ ๋, ํน์ ํธ๋์ ์ ์ด ๋ค๋ฅธ ํธ๋์ ์ ์์ ๋ณ๊ฒฝ ๋๋ ์กฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๊ฒ ํ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋จ๊ณ์ ๋๋ค.
๊ฒฉ๋ฆฌ ์์ค์ด ๋์ ์์๋๋ก SERIALIZABLE, REPEATABLE READ, READ COMMITTED, READ UNCOMMITED๊ฐ ์กด์ฌํฉ๋๋ค. ๊ฒฉ๋ฆฌ ์์ค์ด ๋์์๋ก ์ฑ๋ฅ์ ์ ํ๋์ง๋ง ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ๋ณด์ฅ๋๊ณ , ๊ฒฉ๋ฆฌ ์์ค์ด ๋ฎ์์๋ก ์ฑ๋ฅ์ ์ข์์ง์ง๋ง ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๋ฎ์์ง๋๋ค.
[ ๊ฒฉ๋ฆฌ ์์ค ]
1. SERIALIZABLE
๊ฐ์ฅ ๋์ ์์ค์ ๊ฒฉ๋ฆฌ๋ก, ํธ๋์ ์ ์ ์์ฐจ์ ์ผ๋ก ์คํํฉ๋๋ค. ๋ค๋ฅธ ์ฌ์ฉ์๋ ํธ๋์ญ์ ์์ญ์ ํด๋นํ๋ ๋ฐ์ดํฐ์ ๋ํด ์์ ๋ฐ ์ ๋ ฅ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์ด์ ํ์์ ๋ฐฉ์งํ๋ฉฐ, ๊ฐ์ฅ ๋์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค. ํ์ง๋ง ๋์์ฑ์ด ๋ฎ์์ ธ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
2. REPEATABLE READ
ํธ๋์ญ์
์ด ๋ฒ์ ๋ด์์ ์กฐํํ ๋ฐ์ดํฐ ๋ด์ฉ์ด ํญ์ ๋์ผํจ์ ๋ณด์ฅํฉ๋๋ค. ๋ค๋ฅธ ์ฌ์ฉ์๋ ํธ๋์ญ์
์์ญ์ ํด๋นํ๋ ๋ฐ์ดํฐ์ ๋ํด ์์ ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์๋ ๋ ๋ฒจ์ ๋นํด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๋์ต๋๋ค.
ํ์ง๋ง ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ฝ์
๋๋ฉด Phantom Read ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
3. READ COMMITTED
ํธ๋์ญ์ ์ด ์ปค๋ฐ๋ ๋ณ๊ฒฝ์ฌํญ๋ง ๋ค๋ฅธ ํธ๋์ญ์ ์ด ์ฝ์ ์ ์์ต๋๋ค. Dirty Read๋ฅผ ๋ฐฉ์งํ ์ ์์ง๋ง ๋๋จธ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ง์ DBMS(Oracle, SQL Server, PostgreSQL)์ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์์ค์ ๋๋ค.
4. READ UNCOMMITTED
ํธ๋์ญ์
์ด commit๋์ง ์์ ๋ณ๊ฒฝ์ฌํญ์ ๋ค๋ฅธ ํธ๋์ญ์
์ด ์ฝ์ ์ ์์ต๋๋ค. ๊ฐ์ฅ ๋ฎ์ ์์ค์ ๊ฒฉ๋ฆฌ๋ก ์ฑ๋ฅ์ด ๋ฐ์ด๋์ง๋ง ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ๋ณด์ฅ๋์ง ์์ ์ ๋ขฐ์ฑ์ด ๋ฎ์ต๋๋ค.
Dirty Read, Non-Repeatable Read, Phantom Read๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
[ ๊ฒฉ๋ฆฌ ์์ค์ ํธ๋ ์ด๋ ์คํ (์ฑ๋ฅ vs ์ผ๊ด์ฑ) ]
๊ฒฉ๋ฆฌ ์์ค | Dirty Read | Non-Repeatable Read | Phantom Read | ์ฑ๋ฅ |
READ UNCOMMITTED | โ ๋ฐ์ | โ ๋ฐ์ | โ ๋ฐ์ | ๊ฐ์ฅ ๋น ๋ฆ |
READ COMMITTED | โ ๋ฐฉ์ง | โ ๋ฐ์ | โ ๋ฐ์ | ๋น ๋ฆ |
REPEATABLE READ | โ ๋ฐฉ์ง | โ ๋ฐฉ์ง | โ ๋ฐ์ (MySQL์์๋ ๋ฐฉ์ง) | ๋๋ฆผ |
SERIALIZABLE | โ ๋ฐฉ์ง | โ ๋ฐฉ์ง | โ ๋ฐฉ์ง | ๊ฐ์ฅ ๋๋ฆผ |
4๏ธโฃTransaction ์ด์ํ์
ACID ์์น์ด ๋ณด์ฅ๋์ง ์์์ ๋ ๋ํ๋ ์ ์๋ ์ด์ํ์๋ค์ด ์กด์ฌํฉ๋๋ค.
Dirty Read, Non-Repeatable Read, Phantom Read, Lost Update
1. Dirty Read
- ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๋ฌธ์ ์ ๋๋ค.
-- ์์
- ํธ๋์ญ์
A๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์์ ๋, B๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
ํ์ง๋ง ๋์ค์ ํธ๋์ญ์ A๊ฐ ๋กค๋ฐฑ๋๋ฉด ํธ๋์ญ์ B๋ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
-- ํธ๋์ญ์
A: ์ฌ์ฉ์ ์์ก์ ๋ณ๊ฒฝํ๋ ์ค (์์ง ์ปค๋ฐํ์ง ์์)
BEGIN;
UPDATE accounts SET balance = 100 WHERE user_id = 'A';
-- ํธ๋์ญ์
B: ํธ๋์ญ์
A๊ฐ ์ปค๋ฐํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํจ (Dirty Read ๋ฐ์)
SELECT balance FROM accounts WHERE user_id = 'A'; -- ๐จ 100์ด ์กฐํ๋จ (๋ฌธ์ ๋ฐ์)
-- ํธ๋์ญ์
A ๋กค๋ฐฑ
ROLLBACK;
-- ์์ธ
- READ UNCOMMITTED ๊ฒฉ๋ฆฌ ์์ค์์๋ ์ปค๋ฐ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
2. Non-repeatable Read
- ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฒ ์กฐํํ์ ๋, ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๋ฌธ์ ์ ๋๋ค.
-- ์์
- ํธ๋์ญ์ A๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ , ํธ๋์ญ์ B๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ปค๋ฐํ ํ, ํธ๋์ญ์ A๊ฐ ๋ค์ ์ฝ์ผ๋ฉด ๋ค๋ฅธ ๊ฐ์ ์ป๊ฒ๋ฉ๋๋ค.
-- ํธ๋์ญ์
A: ์ฒ์์ ์์ก์ ์กฐํํจ
BEGIN;
SELECT balance FROM accounts WHERE user_id = 'A'; -- ๊ฒฐ๊ณผ: 500
-- ํธ๋์ญ์
B: ๊ฐ์ ๊ณ์ข์ ์์ก์ ๋ณ๊ฒฝํ๊ณ ์ปค๋ฐ
BEGIN;
UPDATE accounts SET balance = 300 WHERE user_id = 'A';
COMMIT;
-- ํธ๋์ญ์
A: ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์กฐํ
SELECT balance FROM accounts WHERE user_id = 'A'; -- ๐จ ๊ฒฐ๊ณผ: 300 (๋ณ๊ฒฝ๋จ!)
-- ์์ธ
- READ COMMITED ๊ฒฉ๋ฆฌ ์์ค์์๋ ํธ๋์ญ์ ์ด ์กฐํํ ๋๋ง๋ค ์ปค๋ฐ๋ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค.
3. Phantom Read
- ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฒ ์กฐํํ์ ๋ ๊ฒฐ๊ณผ ์งํฉ์ด ๋ฌ๋ผ์ง๋ ๋ฌธ์ ์ ๋๋ค.
-- ์์
- ํธ๋์ญ์ A๊ฐ ํน์ ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ , ํธ๋์ญ์ B๊ฐ ํด๋น ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ /์ญ์ ํ ํ, ํธ๋์ญ์ A๊ฐ ๋ค์ ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ์กฐํํ๋ฉด ๊ฒฐ๊ณผ ์งํฉ์ด ๋ฌ๋ผ์ง๋๋ค.
-- ํธ๋์ญ์
A: ํ์ฌ CS ํ๊ณผ ํ์ ์๋ฅผ ์กฐํํจ
BEGIN;
SELECT COUNT(*) FROM students WHERE department = 'CS'; -- ๊ฒฐ๊ณผ: 10
-- ํธ๋์ญ์
B: CS ํ๊ณผ์ ์๋ก์ด ํ์์ ์ถ๊ฐํ๊ณ ์ปค๋ฐ
BEGIN;
INSERT INTO students (id, name, department) VALUES (11, 'John Doe', 'CS');
COMMIT;
-- ํธ๋์ญ์
A: ๋ค์ ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ์กฐํํจ
SELECT COUNT(*) FROM students WHERE department = 'CS'; -- ๐จ ๊ฒฐ๊ณผ: 11 (ํ์ ์ถ๊ฐ๋จ!)
-- ์์ธ
- REPEATABLE READ ๊ฒฉ๋ฆฌ ์์ค๊น์ง๋ ๊ธฐ์กด ํ์ ๋ณ๊ฒฝ๋ง ๋ฐฉ์ง(Non-Repeatable Read ํด๊ฒฐ)ํ๊ณ ,
- ์๋ก์ด ํ ์ถ๊ฐ๋ ๋ฐฉ์งํ์ง ์์ต๋๋ค.
โ Non-Repeatable Read ์ Phantom Read ์ฐจ์ด์
๋ฌธ์ ์ ํ | ์์ธ | ๋ฐ์ ์กฐ๊ฑด |
Phantom Read | ์กฐํ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ์ด ์ถ๊ฐ ๋๋ ์ญ์ ๋จ | INSERT, DELETE |
Non-Repeatable Read | ๋์ผํ ํ(row)์ ๊ฐ์ด ๋ณ๊ฒฝ๋จ | UPDATE, DELETE |
4. Lost Update (๊ฐฑ์ ์์ค)
- ์ฌ๋ฌ ๊ฐ์ ํธ๋์ ์ ์ด ํ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ๊ฐฑ์ (update)ํ ๋ ํ๋์ ํธ๋์ญ์ ์ ๊ฐฑ์ ์ด ๋ฌดํจํ๋๋ ๊ฒ์ ๋๋ค.
-- ์์
-- ํธ๋์ญ์
A
SELECT balance FROM accounts WHERE id = 1; -- ํ์ฌ ์์ก: 100
UPDATE accounts SET balance = 90 WHERE id = 1;
-- ํธ๋์ญ์
B (A๊ฐ ๋๋๊ธฐ ์ ์ ์คํ)
SELECT balance FROM accounts WHERE id = 1; -- ํ์ฌ ์์ก: 100
UPDATE accounts SET balance = 80 WHERE id = 1;
-- ํธ๋์ญ์
B๊ฐ ์ปค๋ฐ ํ, ํธ๋์ญ์
A๊ฐ ์ปค๋ฐํ๋ฉด ์์ก์ด 90์ด ์๋๋ผ 80์ด ๋จ (A์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฌ๋ผ์ง)