Study

[DB] ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation Level)์ด๋ž€?

์„œ์ฑ„๋ฆฌ 2024. 2. 16. 00:54

๐ŸŒฑ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Transaction Isolation Level)

ํŠธ๋žœ์žญ์…˜์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€(Isolation Level)์ด๋ž€ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์ฒ˜๋ฆฌ๋  ๋•Œ, ํŠน์ • ํŠธ๋žœ์žญ์…˜์ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ๊ฒฉ๋ฆฌ(๊ณ ๋ฆฝ) ์ˆ˜์ค€์ด ๋‚ฎ์€ ์ˆœ์„œ๋Œ€๋กœ READ UNCOMMITED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

  • READ UNCOMMITED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

 ์ฐธ๊ณ ๋กœ ์•„๋ž˜์˜ ์˜ˆ์ œ๋“ค์€ ๋ชจ๋‘ ์ž๋™ ์ปค๋ฐ‹(AUTO COMMIT)์ด false์ธ ์ƒํƒœ์—์„œ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค.

 

1๏ธโƒฃ READ UNCOMMITED (Level 0)

READ UNCOMMITTED๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.

READ UNCOMMITTED์—์„œ๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์ž‘์—…์ด ์ปค๋ฐ‹ ๋˜๋Š” ๋กค๋ฐฑ๋˜์ง€ ์•Š์•„๋„ ์ฆ‰์‹œ ๋ณด์ด๊ฒŒ ๋œ๋‹ค.

 

 

1. ์›”๊ธ‰ ์ˆ˜์ • ํŠธ๋žœ์žญ์…˜์—์„œ ๊น€๊ฐ€๋‚˜ ์‚ฌ์›์˜ ์›”๊ธ‰์„ 250๋งŒ์›์—์„œ 300๋งŒ์›์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋๋‹ค.

3. ์›”๊ธ‰ ์กฐํšŒ ํŠธ๋žœ์žญ์…˜์—์„œ ๊น€๊ฐ€๋‚˜ ์‚ฌ์›์˜ ์›”๊ธ‰์„ ์กฐํšŒํ–ˆ๋‹ค.

4. READ UNCOMMITTED์—์„œ๋Š” ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊น€๊ฐ€๋‚˜ ์‚ฌ์›์˜ ์›”๊ธ‰์„ 300๋งŒ์›์œผ๋กœ ์กฐํšŒํ–ˆ๋‹ค.

5. ์›”๊ธ‰ ์ˆ˜์ • ํŠธ๋žœ์žญ์…˜์—์„œ ์–ด๋– ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด ROLLBACK ๋๋‹ค.

6. ์กฐ๊ธˆ ๋’ค์— ๋‹ค์‹œ ๊น€๊ฐ€๋‚˜ ์‚ฌ์›์˜ ์›”๊ธ‰ ์กฐํšŒ๋ฅผ ํ•ด๋ณด๋‹ˆ 250๋งŒ์›์œผ๋กœ ์กฐํšŒ๋œ๋‹ค.

 

์‹œ๊ฐ ์›”๊ธ‰ ์ˆ˜์ • ํŠธ๋žœ์žญ์…˜ ์›”๊ธ‰ ์กฐํšŒ ํŠธ๋žœ์žญ์…˜
09:37:00 ํŠธ๋žœ์žญ์…˜ BEGIN  
09:37:01 ๊น€๊ฐ€๋‚˜ ์‚ฌ์›์˜ ์›”๊ธ‰์„ 300๋งŒ์›์œผ๋กœ UPDATE  
09:37:02   ํŠธ๋žœ์žญ์…˜ BEGIN
09:37:03   ๊น€๊ฐ€๋‚˜ ์‚ฌ์› ์›”๊ธ‰ ์กฐํšŒ: 300๋งŒ์›
09:37:04   ํŠธ๋žœ์žญ์…˜ COMMIT
09:37:05 ํŠธ๋žœ์žญ์…˜ ROLLBACK  

DB์—์„œ ๊น€๊ฐ€๋‚˜ ์‚ฌ์›์˜ ์›”๊ธ‰์ด 300๋งŒ์›์ด ๋œ ์ ์ด ์—†๋Š”๋ฐ 09์‹œ 37๋ถ„ 3์ดˆ์— ์›”๊ธ‰ ์กฐํšŒ ํŠธ๋žœ์žญ์…˜์€ ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์ธ 300๋งŒ์›์„ ์ฝ์–ด๊ฐ”๋‹ค.

โ†’ dirty read ๋ฐœ์ƒ

 

์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์™€ ๊ฐ™์ด dirty readํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด DB๋ฅผ UPDATE ํ–ˆ๋‹ค๋ฉด ๋” ํฐ ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚  ๊ฒƒ์ด๋‹ค.

 

์ด์ฒ˜๋Ÿผ READ UNCOMMITTED ๊ฒฉ๋ฆฌ์ˆ˜์ค€์€ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ RDBMS ํ‘œ์ค€์—์„œ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์œผ๋กœ ์ธ์ •๋˜์ง€ ์•Š๋Š”๋‹ค.

 

2๏ธโƒฃ READ COMMITTED (Level 1)

READ COMMITTED๋Š” ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ Oracle, PostgreSQL ๋“ฑ ๋งŽ์€ RDBMS์˜ default ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.

READ COMMITTED์€ READ UNCOMMITTED ๊ฒฉ๋ฆฌ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ–ˆ๋˜ dirty read ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์‹œ๊ฐ ์›”๊ธ‰ ์ˆ˜์ • ํŠธ๋žœ์žญ์…˜ ์›”๊ธ‰ ์กฐํšŒ ํŠธ๋žœ์žญ์…˜
09:37:00 ํŠธ๋žœ์žญ์…˜ BEGIN  
09:37:01 ๊น€๊ฐ€๋‚˜ ์‚ฌ์› ์›”๊ธ‰ ์กฐํšŒ: 250๋งŒ์›  
09:37:02 ๊น€๊ฐ€๋‚˜ ์‚ฌ์›์˜ ์›”๊ธ‰์„ 300๋งŒ์›์œผ๋กœ UPDATE ํŠธ๋žœ์žญ์…˜ BEGIN
09:37:03   ๊น€๊ฐ€๋‚˜ ์‚ฌ์› ์›”๊ธ‰ ์กฐํšŒ: 250๋งŒ์›
09:37:04 ํŠธ๋žœ์žญ์…˜ COMMIT  
09:37:05   ๊น€๊ฐ€๋‚˜ ์‚ฌ์› ์›”๊ธ‰ ์กฐํšŒ: 300๋งŒ์›
09:37:06   ํŠธ๋žœ์žญ์…˜ COMMIT

 

์›”๊ธ‰ ์กฐํšŒ ํŠธ๋žœ์žญ์…˜์—์„œ ๊น€๊ฐ€๋‚˜ ์‚ฌ์›์˜ ์›”๊ธ‰์„ ์กฐํšŒํ•˜๋Š” ๋˜‘๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์ฒซ ๋ฒˆ์งธ๋Š” 250๋งŒ์›, ๋‘ ๋ฒˆ์งธ๋Š” 300๋งŒ์›์ด ์กฐํšŒ๋œ๋‹ค.

โ†’ Non-Repeatable Read ๋ฐœ์ƒ

์ด๋ ‡๊ฒŒ ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๊ฐ™์€ row์˜ ๊ฐ’์ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ Non-Repeatable Read(๋ฐ˜๋ณต ์ฝ๊ธฐ ๋ถˆ๊ฐ€๋Šฅ)์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

3๏ธโƒฃ REPEATABLE READ (Level 2)

REPEATABLE READ๋Š” MVCC๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ํ•œ ๋ฒˆ ์ฝ์€ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Non-Repeatable Read ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋”๋ณด๊ธฐ

์ผ๋ฐ˜์ ์ธ RDBMS๋Š” ๋ณ€๊ฒฝ ์ „์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ undo ๊ณต๊ฐ„์— ๋ฐฑ์—…ํ•ด๋‘”๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ณ€๊ฒฝ ์ „/ํ›„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์กด์žฌํ•˜๋ฏ€๋กœ, ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ํ•˜์—ฌ ์ด๋ฅผ MVCC(Multi-Version Concurrency Control, ๋‹ค์ค‘ ๋ฒ„์ „ ๋™์‹œ์„ฑ ์ œ์–ด)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. MVCC๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋œ ๊ฒฝ์šฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ ๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ํŠธ๋žœ์žญ์…˜์€ ์ˆœ์ฐจ ์ฆ๊ฐ€ํ•˜๋Š” ๊ณ ์œ ํ•œ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ๋ฐฑ์—… ๋ ˆ์ฝ”๋“œ์—๋Š” ์–ด๋Š ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ๋ฐฑ์—…๋˜์—ˆ๋Š”์ง€ ํŠธ๋žœ์žญ์…˜ ๋ฒˆํ˜ธ๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถˆํ•„์š”ํ•ด์ง„๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ์‹œ์ ์— ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์“ฐ๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ์‚ญ์ œํ•œ๋‹ค.

โ†’ MVCC๋ฅผ ํ†ตํ•ด ํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด ๋™์ผ ๊ฒฐ๊ณผ ๋ณด์žฅ

 

์ด ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ MySQL(MariaDB)์˜ default ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.

ํ•˜์ง€๋งŒ REPEATABLE READ๋Š” ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ์˜ ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ์— ๋ถ€์ •ํ•ฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ์˜ ์ถ”๊ฐ€๊นŒ์ง€๋Š” ๋ง‰์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์— ์˜ํ•ด ์ถ”๊ฐ€๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ ๋ น ์ฝ๊ธฐ(Phantom Read)๋ผ๊ณ  ํ•œ๋‹ค.

 

๐Ÿค” ์–ธ์ œ Phantom Read๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฑธ๊นŒ?

 

์‹œ๊ฐ ์›”๊ธ‰์ด 300 ์ด์ƒ์ธ ์ง์› ์กฐํšŒ ํŠธ๋žœ์žญ์…˜ ์›”๊ธ‰ 350์ธ ์‹ ์ž…์‚ฌ์› row ์‚ฝ์ž… ํŠธ๋žœ์žญ์…˜
09:37:00 ํŠธ๋žœ์žญ์…˜ BEGIN  
09:37:01 ์›”๊ธ‰ 300 ์ด์ƒ ์ง์› ์กฐํšŒ: 1๋ช…
SELECT WHERE salary >= 300 FOR UPDATE
ํŠธ๋žœ์žญ์…˜ BEGIN
09:37:02   ๋ฐ•๋‹ค๋ผ ์‚ฌ์› ์‚ฝ์ž…: ์›”๊ธ‰ 300๋งŒ์›
09:37:03   ํŠธ๋žœ์žญ์…˜ COMMIT
09:37:04 ์›”๊ธ‰ 300 ์ด์ƒ ์ง์› ์กฐํšŒ: 2๋ช…
SELECT WHERE salary >= 300 FOR UPDATE

!!! Phantom Read ๋ฐœ์ƒ!!!
 
09:37:05 ํŠธ๋žœ์žญ์…˜ COMMIT  

 

์›”๊ธ‰์ด 300 ์ด์ƒ์ธ ์ง์›์„ ์กฐํšŒํ•  ๋•Œ SELECT FOR UPDATE๋ฅผ ์ด์šฉํ•ด ์›”๊ธ‰์ด 300 ์ด์ƒ์ธ ์ง์›๋“ค์— ๋Œ€ํ•ด ์“ฐ๊ธฐ ์ž ๊ธˆ์„ ๊ฑธ์—ˆ๋‹ค.

ํ•ด๋‹น ๊ตฌ๋ฌธ์€ ๋ฒ ํƒ€์  ์ž ๊ธˆ(๋น„๊ด€์  ์ž ๊ธˆ, ์“ฐ๊ธฐ ์ž ๊ธˆ)์„ ๊ฑฐ๋Š” ๊ฒƒ์ด๋‹ค. (๋‚˜ ๋ฐ์ดํ„ฐ ์ˆ˜์ •ํ•˜๋ ค๊ณ  SELECT ํ•˜๋Š” ์ค‘์ด๋‹ˆ๊นŒ ๋‹ค๋ฅธ์‚ฌ๋žŒ๋“ค์€ ๋ฐ์ดํ„ฐ์— ์†๋Œ€์ง€๋งˆ!!~) ์ž ๊ธˆ ์žˆ๋Š” ์ฝ๊ธฐ๋Š” ํ…Œ์ด๋ธ”์— ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ…Œ์ด๋ธ”์— ์ž ๊ธˆ์„ ๊ฑธ๊ณ  undo ๋กœ๊ทธ๊ฐ€ ์•„๋‹Œ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค. ๋ฝ์€ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ ๋˜๋Š” ๋กค๋ฐฑ ๋  ๋•Œ ํ•ด์ œ๋œ๋‹ค.

 

์›”๊ธ‰์ด 350๋งŒ์›์ธ ๋ฐ•๋‹ค๋ผ ์‚ฌ์›์„ ์‚ฝ์ž…ํ•  ๋•Œ ์ผ๋ฐ˜์ ์ธ DBMS๋Š” ๊ฐญ๋ฝ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ salary >= 300 ์ธ ๋ ˆ์ฝ”๋“œ๋งŒ ์ž ๊ธˆ์ด ๊ฑธ๋ฆฐ ์ƒํƒœ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์‹ ์ž…์‚ฌ์› ์‚ฝ์ž… ์š”์ฒญ์€ ์ž ๊ธˆ ์—†์ด ์ฆ‰์‹œ ์‹คํ–‰๋œ๋‹ค.

 

๊ทธ ํ›„ ์›”๊ธ‰ 300 ์ด์ƒ ์ง์› ์กฐํšŒ ํŠธ๋žœ์žญ์…˜์ด ๋™์ผํ•œ ์“ฐ๊ธฐ ์ž ๊ธˆ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํ•œ๋ฒˆ ์กฐํšŒํ•˜๋ฉด, ์ด๋ฒˆ์—๋Š” 2๊ฑด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋œ๋‹ค.

์ด๋ ‡๋“ฏ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์— ์˜ํ•ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ณด์˜€๋‹ค ์•ˆ๋ณด์˜€๋‹ค ํ•˜๋Š” ํ˜„์ƒ์„ Phantom Read ๋ผ๊ณ  ํ•œ๋‹ค.

 

๋Œ€๋ถ€๋ถ„์˜ RDBMS๋Š” REPEATABLE READ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ Phantom Read ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ MySQL(MariaDB)์€ ๋‹ค๋ฅธ RDBMS์™€ ๋‹ค๋ฅด๊ฒŒ ํŠน์ˆ˜ํ•œ Gap Lock์ด ์กด์žฌํ•ด ๋™์ž‘์ด ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์žˆ์–ด ์ผ๋ฐ˜์ ์œผ๋กœ Phantom Read๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋”๋ณด๊ธฐ

๐Ÿคง MySQL์˜ Gap Lock

๋ ˆ์ฝ”๋“œ์™€ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ถˆ ๋ ˆ์ฝ”๋“œ์˜ ์ƒ์„ฑ, ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๋ฅผ ์ œ์–ดํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ์„ฑ์ด J๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ Jo, Joe 2๊ฐœ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ์–ธ์ œ๋“ ์ง€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋“ค ex) Jang, Jeong, Jung ์ด ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์—์„œ ์กฐํšŒ๋ฅผ ํ•  ๋•Œ, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š๋„๋ก ์ž ๊ทธ๋ ค๋ฉด 

SELECT * FROM member WHERE last_name LIKE "J%" FOR UPDATE;         // ์“ฐ๊ธฐ ์ž ๊ธˆ(๋ฒ ํƒ€๋ฝ)
SELECT * FROM member WHERE last_name LIKE "J%" LOCK IN SHARE MODE; // ์ฝ๊ธฐ ์ž ๊ธˆ(๊ณต์œ ๋ฝ)

์œ„์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ SELECT โ€ฆ FOR UPDATE ๊ตฌ๋ฌธ์€ ๋ฒ ํƒ€์  ์ž ๊ธˆ(๋น„๊ด€์  ์ž ๊ธˆ, ์“ฐ๊ธฐ ์ž ๊ธˆ)์„ ๊ฑฐ๋Š” ๊ฒƒ์ด๋‹ค.

์ฝ๊ธฐ ์ž ๊ธˆ์„ ๊ฑธ๋ ค๋ฉด  LOCK IN SHARE MODE ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋ฝ์€ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ ๋˜๋Š” ๋กค๋ฐฑ๋  ๋•Œ ํ•ด์ œ๋œ๋‹ค. 

 

REPEATABLE READ์˜ Phantom Read์™€ ๊ด€๋ จํ•ด ๋„์›€์ด ๋˜์—ˆ๋˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฒจ๋ถ€ํ•œ๋‹ค.

 

[MySQL] ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ˆ˜์ค€์˜ ๋ฝ์˜ ์ข…๋ฅ˜(๋ ˆ์ฝ”๋“œ ๋ฝ, ๊ฐญ ๋ฝ, ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ, ์ž๋™ ์ฆ๊ฐ€ ๋ฝ)

์ด๋ฒˆ์—๋Š” ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ˆ˜์ค€์˜ ๋ฝ์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋‚ด์šฉ์€ RealMySQL๊ณผ MySQL ๊ณต์‹ ๋ฌธ์„œ ๋“ฑ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์œผ๋ฉฐ, ๋ชจ๋“  ๋‚ด์šฉ์€ InnoDB๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. 1. ์Šค

mangkyu.tistory.com

 

4๏ธโƒฃ SERIALIZABLE

SERIALIZABLE์€ ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์œผ๋กœ, ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰์‹œํ‚ค๋Š” ๊ฒฉ๋ฆฌ์ˆ˜์ค€์ด๋‹ค.

 

SELECT ... FOR UPDATE์€ ํŠน์ • row๋“ค์—๋งŒ lock์„ ๊ฑฐ๋Š” ๋ฐ˜๋ฉด SERIALIZABLE์—์„œ๋Š” ์ „์ฒด์— lock์„ ๊ฑด๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

(RDBMS๋งˆ๋‹ค ์ฐจ์ด๊ฐ€ ์žˆ์–ด ๋ชจ๋“  RDBMS๊ฐ€ SERIALIZABLE ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ผ ๋•Œ ์ „์ฒด lock์„ ๊ฑฐ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.)

 

SERIALIZABLE์—์„œ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์ผํ•œ ๋ ˆ์ฝ”๋“œ์— ๋™์‹œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ ๋ถ€์ •ํ•ฉ ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋™์‹œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋–จ์–ด์ง„๋‹ค.

 

 

 

 

https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/transaction-isolation-levels?view=sql-server-ver16

https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html

https://joont92.github.io/db/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-isolation-level/

https://mangkyu.tistory.com/299

https://dololak.tistory.com/446

https://skasha.tistory.com/51

https://breakcoding.tistory.com/406