Dirty Read
Commit๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ Transaction์์ ์ฝ์ ์ ์๋ค๋ฉด ์ด๋ค ํ์์ด ๋ฐ์ํ ์ ์์๊น์?
์ต์ข ์ฐ๋ด ๊ณ์ฐํ๋ ์์๋ก ๋ฐ์ํ ์ ์๋ ํ์์ ์์ ๋ณด๊ฒ ์ต๋๋ค. ์ต์ข ์ฐ๋ด์ ํ์ฌ ์ฐ๋ด + ํด์ง๊ธ + ์ธ์ผํฐ๋ธ๋ก ์ต์ข ๊ฒฐ์ ๋๋ ๊ฒ์ผ๋ก ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๋ง์ฝ Commit๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ Transaction์์ ์ฝ์ ์ ์๋ค๋ฉด, ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์์ ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ ๊ฐ์ ์ฝ์ต๋๋ค. ํด์ง๊ธ๊น์ง๋ง ํฉ์ฐํ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฉด 3900์ด๋๊ณ ์ธ์ผํฐ๋ธ๊น์ง ํฉ์ฐํ์ ๋ 4200์ ๊ฐ์ ์ฝ์ต๋๋ค. ์ฆ, ์ผ๊ด์ฑ ์์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ ์ฐ์ฐ ๊ณผ์ ์์ ์ต์ข ๊ฐ์ด ์๋ ์ค๊ฐ๊ฐ์ ๋ฐ์์ค๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ Commit๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ Transaction์์ ์ฝ๋ ๊ฒ์ ํ์ฉํ๋ ๊ฒ์ด Dirty Read ์ ๋๋ค. Dirty Read ์ฒ๋ผ ์ผ๊ด์ฑ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํด์ค์ผ ํฉ๋๋ค.
๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ด๋?
๋จ์ผ SQL๋ฌธ์ด ์คํ๋๋ ๋์ค ๋ค๋ฅธ Transaction์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ, ์ญ์ , ๋ณ๊ฒฝํ๋๋ผ๋ ์ผ๊ด์ฑ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒ.
Dirty Read๋ฅผ ํ์ฉํ๋ค๋ฉด ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ๊ทธ๋ผ Dirty Read๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น์?
Oracle ์ด์ธ์ DBMS Dirty Read ๋ฐฉ์ง ๋ฐฉ๋ฒ
Oracle ์ด์ธ์ DBMS์์๋ Row Lock์ ์ฌ์ฉํฉ๋๋ค. Lock์ด ๊ฑธ๋ฆฐ ROW์ ๋ํด์๋ ์ฝ์ง ๋ชปํ๊ฒ Lock์ ๊ฑธ์ด๋ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด Commit๋๊ธฐ ์ ๊น์ง ํด๋น ํ์ ์ฝ์ ์ ์๊ธฐ ๋๋ฌธ์ Commit๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ด Dirty Read๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ Dirty Read๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ ๋ง์ผ๋ก ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ ์ ์์๊น์?
๊ธ์ฌ์ ํฉ๊ณ๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์์ ์ค๊ฐ์ ๋ค๋ฅธ Transaction์ด INSERT ์์ ์ ํฉ๋๋ค. ๊ธ์ฌํฉ๊ณ ์ฝ๊ธฐ ์์ ์ด ๋๋๊ธฐ๋ ์ ์ Commit๊น์ง ์๋ฃํด๋ฒ๋ฆฝ๋๋ค. ์ด๋ ๊ธ์ฌ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋๊น์ง ์ฝ์๋์ง, ๊ทธ ์์ ์ ๋ฐ๋ผ ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์ฌ ์ ์์ต๋๋ค.
CASE1 : ์ด๋ฏธ ์ฝ๊ธฐ ์์ ์ด ์ง๋๊ฐ๊ณ INSERT ๋์์ ๋
INSERT ์์ ์ด ์ฝ๊ธฐ ์์ ์ด ์ง๋๊ฐ๊ณ Commit๋์๊ธฐ ๋๋ฌธ์ ๊ธ์ฌ ํฉ๊ณ์์ ๋๋ฝ๋ฉ๋๋ค.
CASE2 : ์ฝ๊ธฐ ์์ ์ ์ INSERT ๋์์ ๋
INSERT ์์ ์ด ์ฝ๊ธฐ ์์ ์ด ์ด๋ฃจ์ด์ง๊ธฐ ์ ์ Commit๋์๊ธฐ ๋๋ฌธ์ ๊ธ์ฌ ํฉ๊ณ์ ํฌํจ๋ฉ๋๋ค.
Dirty Read๋ฅผ ๋ฐฉ์งํด๋ INSERT ์์ ์ด ์ด๋ฃจ์ด์ง๋ ์์ ์ ๋ฐ๋ผ ํน์ ์ฝ๊ณ ์๋ ์์น์ ๋ฐ๋ผ ์์ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ๊ทธ๋ผ ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด์ ์ด๋ป๊ฒ ํด์ผํ ๊น์?
๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. Table Level Lock์ ํ์ฌ Commit๋๊ธฐ ์ ๊น์ง Table์ ์ฝ์ง ๋ชปํ๊ฒํ๊ฑฐ๋, Transaction Isolation Level(ํธ๋์ ์ ๊ณ ๋ฆฝํ ์์ค)์ ๋์ด๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ง๊ธ๊น์ง๋ Oracle ์ด์ธ์ DBMS์์ ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ์์๋ดค์ต๋๋ค. ๊ทธ๋ผ Oracle์ ์ด๋ป๊ฒ ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ ๊น์?
Oracle ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ
ORACLE์์๋ Undo Segment์ ์ ์ฅํด๋์ Undo Data๋ฅผ ํ์ฉํด์ ์๋ณํ ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
Oracle์์๋ Consistent Mode์ Current Mode ์ฝ๊ธฐ ๋ฐฉ์์ด ์์ต๋๋ค. ๋ ๊ฐ์ง ์ฝ๊ธฐ ๋ชจ๋๋ฅผ ํตํด์ ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋๋ฐ ํ๋์ฉ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Consistent Mode ์ฝ๊ธฐ๋?
Query๊ฐ ์์๋ ์์ ์ ๊ธฐ์ค์ผ๋ก Commit๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค.
Query๊ฐ ์์๋ ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋๋กํฉ๋๋ค. ๊ทธ๋ผ ์ข ๋ ์์ธํ๊ฒ ์ฝ๋ ๊ณผ์ ์ ์์๋ณด๊ฒ ์ต๋๋ค.
Consistent Mode๋ก ์ฝ์์ ๋์ ํ๋ฆ์ ํํํด๋ดค์ต๋๋ค. Query๊ฐ ์์๋ ์์ ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค๊ณ ํ๋๋ฐ, ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ์ํด SCN(System Commit Number)๋ฅผ ์ฌ์ฉํฉ๋๋ค. SCN์ Commit๋ ์๊ฐ์ ๋ฒํธ๋ก ์ง์ ํ ๊ฒ์ผ๋ก ์ดํดํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ผ Query๊ฐ ์คํ๋์์ ๋๋ถํฐ ํ ๋จ๊ณ์ฉ ์์๋ณด๊ฒ ์ต๋๋ค. ํ๋ฆ์ Transaction1์ด ๋๋๊ธฐ ์ ์ Transaction2์์ 3000์ด๋ ๊ธ์ฌ๋ฅผ INSERTํ๊ณ Commit๊น์ง ๋๋ธ ์ํฉ์ ๋๋ค.
1. Query ์คํ
๊ธ์ฌ์ ํฉ๊ณ๋ฅผ ์ฝ๋ ์ฟผ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค. ์ด๋ System์ SCN ๋ฒํธ๋ฅผ ๋ค๊ณ ํ์ํ๊ฒ๋ฉ๋๋ค. ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๊ฐ๋ ๊ณผ์ ์์
Query SCN >= Block SCN์ด๋ฉด Current Block์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
2. ๋ค๋ฅธ Transaction Insert & Commit
๊ธ์ฌ ํฉ๊ณ๋ฅผ ๊ตฌํ๊ธฐ ์ํด ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์๋๋ฐ ๊ทธ ์ฌ์ด์ ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋๊ณ Commit๊น์ง ์๋ฃ๋์์ต๋๋ค.
3. Query SCN < Block SCN ๋ง๋ฌ์๋
CR Block์ ์์ฑํฉ๋๋ค. CR Block์ Current Block์ ๋ณต์ฌ๋ณธ์ ๋๋ค. ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ํด ์์ฑํฉ๋๋ค.
4. Undo Block ์ฝ์ด ์ด์ ๋ฐ์ดํฐ๋ก ๋๋๋ฆฌ๊ธฐ
Undo Data๋ฅผ ์ฝ์ด ํ๋จ๊ณ ์ด์ ์ํ๋ก CR BLock์ ๋๋๋ฆฝ๋๋ค. ์ด๋ ํ๋จ๊ณ ๋๋๋ ค๋ Query SCN < Block SCN ์ด๋ฉด Query SCN >= Block SCN์ด ๋ ๋ ๊น์ง ๊ณ์ Undo Data๋ฅผ ํ์ํฉ๋๋ค.
5. Undo ์๋ฃ๋ CR Block ์ฝ๊ธฐ
4๋ฒ์ ์์ ์ผ๋ก Query SCN >= Block SCN์ด ๋๋ฉด ํด๋น CR Block์ ๋ด์ฉ์ ์ฝ์ต๋๋ค.
์ดํ ํ ์ด๋ธ์ ํ์์ ์์ ๊ณผ์ ๋๋ก ๊ณ์ ์งํํฉ๋๋ค.
- Query SCN >= Block SCN ์ด๋ฉด Current Block์ ์ฝ๋๋ค.
- Query SCN < Block SCN ์ด๋ฉด CR Block์ ์์ฑํด์ Undo Data๋ฅผ ์ฝ๋๋ค.
์ด ์ฒ๋ผ Consistent Mode๋ฅผ ์ฌ์ฉํด์ ์ฝ๋๋ค๋ฉด ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ Query์ ์์์ ๊ธฐ์ค์ผ๋ก ๋ณด์ฅ ๊ฐ๋ฅํ์ง๋ง, ๊ฐฑ์ ์์ ํ ๋ Consistent Mode๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค๋ฉด ๋ฌธ์ ๊ฐ ์์๊น์?
Consistent Mode Update ๋ฌธ์ ์
Consistent Mode๋ Query ์คํ ์์ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค.
Transaction1 Update ์์ SAL = 3000
Transaction2 Update ์์ SAL = 3000
์ ์์๋๋ก ์คํ์ด ๋๋ค๋ฉด ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ์์ํ์๋์? ํ๋ฆ์์ผ๋ก ๋ดค์ ๋ SAL์ 1000์ ๋ํ๊ณ ๊ทธ ๋ค์ SAL์ 3000์ ๋ํฉ๋๋ค. ๊ทธ๋ผ ์ฒ์ SAL์์ 4000์ด ๋ํด์ง 7000์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ง๋ ๋ต๋ณ ์ด๊ฒ ์ฃ ? ํ์ง๋ง, Consistent Mode๋ก Update ์์ ์ ํ๋ค๋ฉด 3000๋ง ๋ํด์ง 6000์ด ๊ฒฐ๊ณผ๋ก ๋์ต๋๋ค.
Transaction1์์ Updateํ ๋ด์ฉ์ด ์ฌ๋ผ์ง๋ Lost Update ํ์์ด ๋ฐ์ํฉ๋๋ค. Transaction2์์ Updateํ๋ ์์ ์์ Transaction1์ด Commit๋์ง ์์๊ธฐ ๋๋ฌธ์ SAL์ ์์ง 3000์ผ๋ก ๋ณด๊ณ ์์ต๋๋ค. Transaction1์ด Commit๋์ด๋ Transaction2์๋ SAL์ ๊ฐ์ 3000์ผ๋ก ๋ณด๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ก 3000๋ง ๋ํด์ง 6000์ด ๊ฒฐ๊ณผ๋ก ๋์ต๋๋ค.
์ด๋ฐ Lost Update์ ๋ํ ๋ฌธ์ ๋ฅผ Current Mode๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฉ์ง๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
Current Mode ์ฝ๊ธฐ๋?
ํ์ฌ ์ฝ๋ ์์ ์ ๊ธฐ์ค์ผ๋ก Commit๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค.
Consistent Mode๋ก ์ฝ์์ ๋ ๋ฌธ์ ๊ฐ ๋์๋ ์์๋ฅผ Current Mode๋ก ํด๋ณด๊ฒ ์ต๋๋ค.
Current Mode๋ ํ์ฌ ์ฝ๋ ์์ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค.
Transaction1 Update ์์ SAL = 3000
Transaction2 Update ์์ SAL = 4000
์ ์์๋๋ก ์คํํ์ ๋๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ง๋ 7000์ด๋ผ๋ ๊ฐ์ด ๊ฒฐ๊ณผ๋ก ๋์ต๋๋ค. ์ข ๋ ์์ธํ ์ดํด๋ณด๋ฉด, Transaction1์์ Update ์์ ์ํ๊ณ , Transaction2์์ Updateํ๋ ค๊ณ ํ ๋ Lock์ด ๊ฑธ๋ ค์๋ ํ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ค๋ฆฝ๋๋ค. Commit์ด ์๋ฃ๋๊ณ Transaction2์์๋ Consistent Mode์ฒ๋ผ Query ์คํ ์์ ์์์ SAL๊ฐ์ ์ฝ๋๊ฒ ์๋๋ผ, ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์์ ์ ๊ธฐ์ค์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ SAL์ 4000์ผ๋ก ๋ณด๊ณ ์๋ ๊ฒ ์ ๋๋ค.
Current Mode๋ฅผ ์ฌ์ฉํด์ Consistent Mode๋ก ํ์ ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ผ ์ฌ๊ธฐ์ ์ด์ ์ ์ ์๋๊ฒ ํ๊ฐ์ง ์์ต๋๋ค. Oracle์์๋ Consistent Mode๋ก ์ฝ๊ณ Current Mode๋ก ์ฝ์ , ๊ฐฑ์ , ์ญ์ ์์ ์ ํ๊ฒ ๊ตฌ๋? ๋ง๋ ๋ง์ ๋๋ค. ํ์ง๋ง ์ข ๋ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค. Current Mode๋ก ๊ฐฑ์ ํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ์์๊น์?
Current Mode ๊ฐฑ์ ๋ฌธ์ ์
Current Mode๋ก ๊ฐฑ์ ์์ ํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ Dirty Read๋ฅผ ํ์ ๋๋ ๋น์ทํ ๋ชจ์ต์ ๋ณด์ ๋๋ค. Current Mode๋ก ๊ฐฑ์ ์์ ์ ํ๋ค๊ณ ํ๋ฉด ์์ ์์์ฒ๋ผ ๋ฒ์๋ฅผ ์ง์ ํด์ Updateํ ๋ INSERTํ๋ ์์ ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์์ ์ ๋ฐ๋ผ ๊ฐฑ์ ํ๋ ๋ฐ์ดํฐ์ ๊ฐฏ์๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค๋ ๊ฒ ์ ๋๋ค. ๊ทธ๋์ Oracle์์๋ Consistent Mode๋ก ์ฝ๊ณ Current Mode๋ก ๊ฐฑ์ ํ๊ตฌ๋!๋ผ๊ณ ์ด์ ์ดํด๋ฅผ ํ์ จ์ ๊ฒ๋๋ค.
์ ๊ฐ๊ฐ Mode๋ฅผ ์ฌ์ฉํ๋์ง ์๊ฒ ๋์๋๋ฐ์. ์คํ๋ ค ๋จธ๋ฆฌ์์ด ๋ณต์กํ๊ณ ํท๊ฐ๋ฆด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ์ ๊ฐ ํท๊ฐ๋ฆฌ๊ฒ ๋ง๋ค์ด ๋ณผ๊ฒ์. ์ ๊ฐ ์ ์๋ ค๋๋ฆฐ๊ฒ ํ๋ ์๋๋ฐ์? ๊ทธ๋ผ ์์ ์์ ๋ 5ํ์ด ๊ฐฑ์ ๋๋๊ฒ ๋ง์๊น์? ์๋๋ฉด 6ํ ๊ฐฑ์ ๋๋๊ฒ ๋ง๋ ๊ฒ ์ผ๊น์?
5ํ๋ง ๊ฐฑ์ ๋๋๊ฒ ๋ง๊ฒ ์ฃ ? UPDATE๊ฐ ๋จผ์ ์คํ๋์๊ณ ๊ทธ ๋ค์์ INSERT๊ฐ ์คํ๋์์ผ๋๊น.... 5ํ๋ง ๊ฐฑ์ ๋๋๊ฒ ๋ง๊ฒ ์ฃ ? ๊ทธ๋์ Consistent Mode๋ก ์ฝ๊ณ Current Mode๋ก ๊ฐฑ์ ํ๊ฒ ์ด๊ฒ ์ฃ ? ์ ๊ทธ๋ฐ๋ฐ ์์ ์ํฉ์์๋ SELECT๋ฌธ์ด ์๋๋ฐ์? ๊ทธ๋ผ CASE2์ ์ํฉ์์๋ UPDATEํ ๋ Current Mode๋ก ์ฝ๋ ๊ฒ์ด๋๊น 6ํ์ด ๊ฐฑ์ ๋๋๊ฒ ๋ง๋๋ฐ์? ๊ทธ๋ผ CASE1์ด๋ CASE2๋ฅผ ํด๊ฒฐ ๋ชปํ๋๊ฑฐ ์๋๊ฐ์??
์์๋ฅผ ํ๋ ๋ ๋ณด๊ฒ ์ต๋๋ค.
4000์ด ๋์ค๋๊ฒ ๋ง๋ ๊ฒ์ผ๊น์? ์๋๋ฉด 6000์ด ๋์ค๋๊ฒ ๋ง๋ ๊ฒ ์ผ๊น์? Current Mode๋ง ์๊ฐํ๋ค๋ฉด ์ ํ ํท๊ฐ๋ฆด ๊ฒ์ด ์์ฃ . ํ์ฌ ์์ ์ผ๋ก ๋ณด๊ธฐ ๋๋ฌธ์ 3000์ด๋ ๊ฐ์ ์์ด ๊ฒฐ๊ณผ๋ก 4000์ด ๋์ค๊ฒ ์ฃ . ๊ทธ๋ฐ๋ฐ Oracle์์๋ Consistent Mode๋ก ์ฝ๊ณ Current Mode๋ก ๊ฐฑ์ ํ๋ฐ์... ์ด ๋ง์ ๋ค์ผ๋๊น ๋ญ๊ฐUpdateํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ณผ์ ์์ Consistent Mode๋ก Query๊ฐ ์์ํ๋ ์์ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด 6000์ด ๋ ๊ฒ ๊ฐ์์.... ๊ทธ๋ผ Lost Update๊ฐ ๋ฐ์ํ๋๋ฐ.... ๋๋ฌด ํท๊ฐ๋ฆฌ๋ค์....
ํท๊ฐ๋ฆฌ๊ฒ ํด์ ์ฃ์กํ๊ณ ์... ์ ๋ง ์ด๋ป๊ฒ ์ด ๋๊ฐ์ง Mode๊ฐ Oracle์์ ์ฌ์ฉ๋๋์ง ์ ๋ฆฌํด ๋๋ฆด๊ฒ์.
Consistent Mode๋ก ๋์์ ์๋ณํ๊ณ , Current Mode๋ก ๊ฐฑ์ ํ๋ค.
์ผ๋จ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋ง๋์ง ์๊ฐํด๋ณด์ธ์. ์๊ฐ์์ผ๋ก ๋ดค์ ๋ Transaction1์ด ๋จผ์ ์คํ๋์๊ณ Transaction2๊ฐ ๋์ค์ ์คํ๋์์ด์. Transaction2๊ฐ ์คํ๋ ๋๋ ์ด๋ฏธ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ก ๊ฐ์ฃผํด์ Update๊ฐ ์๋๋ ๋์. ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ด์ฃ .
Oracle์์๋ Consistent Mode๋ก ๋์์ ์๋ณํ๊ณ , Current Mode๋ก ๊ฐฑ์ ํ๋ค๊ณ ํ๋๋ฐ์. ์ด๊ฑฐ๋ฅผ ๋ค๋ฅธ ๋ง๋ก ํ์ด๋ณด๋ฉด
"Query๋ฅผ ์คํํ๋ ์๊ฐ์ด๋ ์ค์ ๊ฐฑ์ ์์ ์ด ์ด๋ฃจ์ด์ง๋ ์๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅด๋ค๋ฉด ๊ฐฑ์ ํ์ง ์๊ฒ ๋ค." ๋ผ๋ ๋ง ์ ๋๋ค.
์ด๋ง์ ์ง์ง ๋ ๋จ์ํ๊ฒ ํ์ด๋ณด๋ฉด "๋ด๊ฐ ์ฝ์ ๊ฒ๋ง ๊ฐฑ์ ํ๋ค." ์ ๋๋ค.
์ด๊ฒ ๋ณด์ฅ์ด ๋๋ฉด ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋๋ ๊ฒ ์ ๋๋ค.
์ผ๊ด์ฑ ์๊ฒ Query ์์ฑ ์ฃผ์์ฌํญ
Oracle์์ ์๋ฒฝํ ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋๋ค๊ณ ํ์ต๋๋ค. ํ์ง๋ง Oracle์ด ์ด๋ป๊ฒ ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋์ง ์ดํดํ์ง ๋ชปํ๊ณ Query๋ฅผ ์์ฑํ๋ฉด ๋ฌธ์ฅ์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์์ต๋๋ค. Oracle Scott๊ณ์ ์ ์ฌ์ฉํ ์์๋ฅผ ํตํด ์์๋ณด๊ฒ ์ต๋๋ค.
30๋ฒ ๋ถ์ ํ ์ด๋ธ ์์ฑ
1
2
3
4
5
6
7
8
9
|
--30๋ฒ ๋ถ์ ํ
์ด๋ธ ์์ฑ
CREATE TABLE DEPT30
AS
SELECT * FROM EMP
WHERE DEPTNO = 30;
--๋ณด๋์ค ํฌํจ ๊ธ์ฌ ์ปฌ๋ผ
ALTER TABLE DEPT30
ADD (BONUS_SUM_SAL NUMBER);
|
๋ถ์๋ณ ๋ณด๋์ค ํ ์ด๋ธ ์์ฑ
1
2
3
4
5
6
7
8
|
--๋ถ์๋ณ ๋ณด๋์ค ํ
์ด๋ธ ์์ฑ
CREATE TABLE DEPT_BONUS(DEPTNO NUMBER, BONUS NUMBER);
--๋ฐ์ดํฐ ์ถ๊ฐ
INSERT INTO DEPT_BONUS VALUES(30, 1000);
--์ปค๋ฐ
COMMIT;
|
์ค์ต์งํ
๋๊ฐ์ Transaction์ผ๋ก ์ค์ต์ ์งํํ์ต๋๋ค. ์๋์ ํ๋ฆ๋๋ก ์งํํ์ต๋๋ค.
1. Transaction1 : 30๋ฒ ๋ถ์ ๋ณด๋์ค ์ฆ๊ฐ
30๋ฒ ๋ถ์์ ๋ชจ๋ ์ฌ์๋ค์๊ฒ 1000 ์ฆ๊ฐ๋ ๋ณด๋์ค(1000 + 1000)๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ถ๊ฐํ์ต๋๋ค.
2. Transaction1 : 7499 ์ฌ์ ๊ธ์ฌ ์ฆ๊ฐ
7499๋ฒ ์ฌ์์ ๊ธ์ฌ๋ฅผ 500 ์ฆ๊ฐ ์์ผฐ์ต๋๋ค.
3. Transaction2 : ๋ณด๋์ค ์ ์ฉ
๋ค๋ฅธ Transaction์์ 30๋ฒ ๋ถ์์ ์ฌ์๋ค์๊ฒ ๋ณด๋์ค๊ฐ ์ ์ฉ๋ ๊ธ์ฌ๋ฅผ BONUS_SUM_SAL์ ๊ฐฑ์ ํฉ๋๋ค. DEPT_BONUS์ 30๋ฒ ๋ถ์ BONUS๋ฅผ Transaction1์์ ๊ฐฑ์ ์์ ์ ํ๊ณ ์์ด์ ์ฌ๊ธฐ์ Waitingํ๊ฒ ๋ฉ๋๋ค.
4. Transacion1 : Commit
Transaction1 Commit์ ํ๋ฉด์ Transaction2์ Waiting์ด ํ๋ฆฝ๋๋ค.
5. Transaction2 : Commit
Transaction2๊น์ง Commitํฉ๋๋ค.
์์ ์์ ์ด ์๋ฃ๋ ํ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค. ํ๋ฆ๋๋ก 30๋ฒ ๋ถ์์ ๋ณด๋์ค๋ฅผ 1000์ถ๊ฐํ์ฌ 2000์ด ์ต์ข ์ ์ผ๋ก ์ถ๊ฐ๋ ๋ณด๋์ค์ ๋๋ค. ๊ทธ๋ค์ 7499๋ฒ ์ฌ์์ ๊ธ์ฌ๋ฅผ 500 ์ฆ๊ฐ์์ผฐ์ต๋๋ค. ์ด ๋๊ฐ์ง ์์ ์ด ๋๋ ํ ๋ค๋ฅธ Transaction์์ ๋ณด๋์ค ์ ์ฉ์์ ์ ํ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ๋ฐฐ์ด Consistent Mode๋ก ์๋ณํ๊ณ Current Mode๋ก ๊ฐฑ์ ํ๋ค๊ณ ํ์๋, 7749๋ฒ ์ฌ์์ ๊ธ์ฌ๊ฐ 2500์ด ์ฆ๊ฐํ๊ณ ๋๋จธ์ง ์ฌ์๋ค์ 2000์ด ์ฆ๊ฐ๋์ด ์์ด์ผํ๋๊ฒ ๋ง์ต๋๋ค. ๊ทธ๋ผ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
1
2
3
4
5
6
7
8
|
SELECT
EMPNO
,ENAME
,SAL
,BONUS_SUM_SAL
,SAL + BONUS
FROM DEPT30 D, DEPT_BONUS B
WHERE D.DEPTNO = B.DEPTNO;
|
์ค์ ๋ก ๊ฐฑ์ ํ BONUS_SUM_SAL ์ปฌ๋ผ๊ณผ ๊ทธ๋ฅ ์กด์ฌํ๋ ์ฌ์์ ๊ธ์ฌ์ ๋ณด๋์ค๋ฅผ ๋ํ ๊ฐ์ด ์ ๋ค๋ฅผ๊น์?
7499๋ฒ ์ฌ์์ ์ด์ ๊ธ์ฌ๋ 1600์ด์์ต๋๋ค. ๊ธ์ฌ์ 500์ ๋ํ ๊ฐฑ์ ์ ์ด์์์ด ์ ์ฉ ๋์๋๋ฐ, ๋ณด๋์ค๊ฐ 1000 ํฉ์ฐ๋์์ต๋๋ค. ์ค์ ๋ก 2000์ด ๋ํด์ก์ด์ผํ๋๋ฐ 1000๋ง ๋ํด์ง ๊ฒ ์ ๋๋ค. ์์ด๋ด๊น์?
Transaction2์ 3๋ฒ Update๋ฌธ์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
1
2
3
4
5
|
UPDATE DEPT30
SET BONUS_SUM_SAL = SAL + (
SELECT BONUS FROM DEPT_BONUS
WHERE DEPTNO = DEPT30.DEPTNO
);
|
์ค์นผ๋ผ Subquery(๋จ์ผ ๊ฐ)๋ ํน๋ณํ ์ด์ ๊ฐ ์๋ํ Consistent Mode๋ก ์ฝ์ต๋๋ค. Subquery๋ ๋๊ฐ์ด Select๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ Consistent Mode๋ก ๊ฐ์ ์ฝ์ด ์ค๊ฒ ์ฃ ?
SAL ๊ฐ์ Current Mode๋ก ์ฝ์๋๋ฐ Subquery ์์ ์๋ BONUS๊ฐ์ Consistent Mode๋ก ์ฝ์ด Query ๊ฐ ์คํ๋๋ ์์ ์ ๊ธฐ์ค์ผ๋ก ์ด์ ๊ฐ์ธ 1000์ ๋ฐ์์จ ๊ฒ ์ ๋๋ค. ๊ทธ๋ผ ์ฌ๋๋ก๋ ๊ฐ์ผ๋ก UPDATEํ๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น์?
1
2
3
4
5
6
7
8
|
UPDATE DEPT30
SET BONUS_SUM_SAL = (
SELECT
DEPT30.SAL +
BONUS
FROM DEPT_BONUS
WHERE DEPTNO = DEPT30.DEPTNO
);
|
Update๋ DEPT30 ํ ์ด๋ธ์ ๊ฐ์ ๊ฐฑ์ ํ๊ณ ์์ต๋๋ค. ์ฆ, DEPT30ํ ์ด๋ธ์ ๊ฐ์ Current๋ก ์ฝ๋ ๋ค๋ ์๊ธฐ์ฃ . Current Mode๋ก ์ฝ๋ SAL ๊ฐ์ Subquery์์ ๋ฃ์ด์ค์ Subquery๊น์ง Current Mode๋ก ์ฝ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ UPDATE๋ฅผ ํด์คฌ๋ค๋ฉด SELECT ํ์ ๋ ์๋์ ๊ฐ์ด ๋ฌธ์ ์๋ ๊ฐฑ์ ์์ ์ ํฉ๋๋ค.
Subquery ๋ง๊ณ ๋ ์ฌ์ฉ์๊ฐ ์ ์ํ๋ ๋ด์ฉ๋ค์ ๋ํด์๋ ์ฃผ์ ํด์ผํฉ๋๋ค.
USER_AVG๋ผ๋ ์ฌ์ฉ์ํจ์๋ฅผ ๋ง๋ค์๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. EMPํ ์ด๋ธ์ ๊ธ์ฌ ํ๊ท ์ ๋ฐํํด์ฃผ๋ ํจ์์ ๋๋ค. ์ด๋ฐ ํจ์๋ฅผ Query๋ด์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ์๋ ์ผ๊ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง ๋ชปํ ์ ์๋ค๋ ๊ฒ ์ ๋๋ค. ์ฌ์ฉ์ ํจ์ ๋ด์ SELECT ๋ฌธ์ Consistent Mode๋ก ์ฝ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ ์ ๋๋ค. ์ด์ธ์ Procedure๋ Trigger์ฌ์ฉ ์ ๋ฐ์๋ ์ ์์ต๋๋ค.
Oracle์์ ์๋ณํ ๋ฌธ์์์ค ์ฝ๊ธฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ค๊ณ ํด๋ Query์ฌ์ฉ ์ ๊ผญ ๋ด์ฉ์ ์๊ณ ์ฃผ์ํด์ ์์ฑํด์ผํฉ๋๋ค.
๋๊ธ