๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ORACLE/DB

[Oracle] ๋ฌธ์žฅ์ˆ˜์ค€ ์ฝ๊ธฐ ์ผ๊ด€์„ฑ Consistent Mode, Current Mode ์ฐจ์ด :: ๋งˆ์ด์ž๋ชฝ

by ๐ŸŒปโ™š 2020. 3. 30.

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(301000);
 
--์ปค๋ฐ‹
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์‚ฌ์šฉ ์‹œ ๊ผญ ๋‚ด์šฉ์„ ์•Œ๊ณ  ์ฃผ์˜ํ•ด์„œ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€