Lock with Transaction Isolation Level

ํŠธ๋žœ์žญ์…˜์ด๋ž€?

ํŠธ๋žœ์žญ์…˜์ด๋ž€, DB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ์ž‘์—…์˜ ๋‹จ์œ„์ด๋‹ค.

ํŠธ๋žœ์žญ์…˜์€ ์ด๋ก ์ ์œผ๋กœ ACID ์›์น™์„ ๋ณด์žฅํ•ด์•ผํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์‹ค์ œ๋กœ ์ข…์ข… ์ง€์ผœ์ง€์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ์ด์œ ๋Š” ACID ์›์น™์„ strice ํ•˜๊ฒŒ ์ง€ํ‚ค๋ ค๋ฉด ๋™์‹œ์„ฑ์ด ๋งค์šฐ ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— DB ์—”์ง„์€ ACID ์›์น™์„ ํฌ์ƒํ•˜์—ฌ ๋™์‹œ์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ๋ฐ”๋กœ ํŠธ๋žœ์žญ์…˜์˜ isolation level์ด๋‹ค.

isolation ์›์น™์„ ๋œ ์ง€ํ‚ค๋Š” level์„ ์‚ฌ์šฉํ• ์ˆ˜๋ก ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์ปค์ง€์ง€๋งŒ ๋” ๋†’์€ ๋™์‹œ์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

  • Read Uncommitted, Read Committted, Repeatable Read, Serializable

DB ์—”์ง„์€ isolation level์— ๋”ฐ๋ผ ๋‹ค๋ฅธ locking ์ „๋žต์„ ์ทจํ•œ๋‹ค.

isolation level์ด ๋†’์•„์งˆ์ˆ˜๋ก ๋” ๋งŽ๊ณ  strickํ•˜๊ฒŒ lock์„ ๊ฑด๋‹ค.

InnoDB์˜ Lock

InnoDB๋Š” ํŠธ๋žœ์žญ์…˜์˜ ACID ์›์น™๊ณผ ๋™์‹œ์„ฑ์„ ์ตœ๋Œ€ํ•œ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ lock์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • SELECT @@GLOBAL(or SESSION).transaction_isolation ์ฟผ๋ฆฌ๋กœ ํ™•์ธ ๊ฐ€๋Šฅ

  • InnoDB์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ REPEATABLE_READ

row-level lock

๊ธฐ๋ณธ์ ์ธ lock์€ ํ…Œ์ด๋ธ”์˜ row๋งˆ๋‹ค ๊ฑธ๋ฆฌ๋Š” row lock์ด๋‹ค. ์—ฌ๊ธฐ์—๋Š” shared-lock๊ณผ exclusive-lock์ด ์žˆ๋‹ค.

Shared-lock & Exclusive lock

ared-lock & Exclusive lock

Shared-lock(S lock)์€ read์— ๋Œ€ํ•œ lock์ด๋‹ค.

์ผ๋ฐ˜์ ์ธ select ์ฟผ๋ฆฌ๋Š” lock์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  DB์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ๋Š”๋‹ค. ํ•˜์ง€๋งŒ select โ€ฆ for share ๋“ฑ ์ผ๋ถ€ select ์ฟผ๋ฆฌ๋Š” read ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ InnoDB๊ฐ€ ๊ฐ row์— S-lock์„ ๊ฑด๋‹ค.

Exclusive-lock(X-lock)์€ write์— ๋Œ€ํ•œ lock์ด๋‹ค.

select โ€ฆ for update๋‚˜ update, delete ๋“ฑ์˜ ์ˆ˜์ • ์ฟผ๋ฆฌ๋ฅผ ์งˆ์˜ํ•  ๋•Œ ๊ฐ row์— ์„ค์ •ํ•˜๋Š” lock์ด๋‹ค.

๋‘˜์˜ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ํ•˜๋‚˜์˜ row์— S-lock์„ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ํ•˜๋‚˜์˜ row๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

  2. S-lock์ด ๊ฑธ๋ฆฐ row์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด X-lock์„ ๊ฑธ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ฝ๊ณ  ์žˆ๋Š” row๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค.

  3. X-lock์ด ๊ฑธ๋ ค์žˆ๋Š” row์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด S-lock๊ณผ X-lock ๋‘˜๋‹ค ๊ฑธ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์กฐ์ž‘ํ•˜๊ณ  ์žˆ๋Š” row๋Š” ์ฝ๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ๊ฐ€ ์ „๋ถ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”ฐ๋ผ์„œ, S lock์„ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ๋ผ๋ฆฌ๋Š” ๊ฐ™์€ row์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ X-lock์ด ๊ฑธ๋ฆฐ row๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์˜ ์–ด๋– ํ•œ ์ฟผ๋ฆฌ๋„ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

  • shared์™€ exclusive ์ด๋ฆ„์˜ ์˜๋ฏธ์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค.

  • exclusive lock(X-lock)์ด ๊ฑธ๋ฆฌ๋ฉด ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์ฝ๊ธฐ, ์“ฐ๊ธฐ ์ „๋ถ€ ๋ถˆ๊ฐ€๋Šฅ

Record lock

Record lock์€ row๊ฐ€ ์•„๋‹ˆ๋ผ DB index record์— ๊ฑธ๋ฆฌ๋Š” lock์ด๋‹ค.

์—ฌ๊ธฐ๋„ row-level lock๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ S, X-lock์ด ์กด์žฌํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด c1์ด๋ผ๋Š” ์ปฌ๋Ÿผ์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ” t1์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด t1.c1์˜ ๊ฐ’์ด 10์ธ index์—์„œ X lock์ด ๊ฑธ๋ฆฐ๋‹ค.

์ด๋•Œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์—์„œ ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋ฉด,

ํŠธ๋žœ์žญ์…˜ B์˜ ์ฟผ๋ฆฌ๋Š” t1.c1 = 10์ธ index record์— X-lock์„ ๊ฑธ๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๋‹น index record์—๋Š” ์ด๋ฏธ ํŠธ๋žœ์žญ์…˜ A๊ฐ€ X-lock์„ ๊ฑด ์ƒํƒœ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ์‹คํ–‰ํ•œ ์ฟผ๋ฆฌ๋Š” ํŠธ๋žœ์žญ์…˜ A๊ฐ€ commit ๋˜๋Š” rollback์ด ๋˜๊ธฐ ์ „๊นŒ์ง€ t1.c1 = 10 ์ธ row๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค.

delete ์ฟผ๋ฆฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, insert, update ์ฟผ๋ฆฌ๋„ ๋™์ผํ•˜๋‹ค.

์ •๋ฆฌ:

  1. select โ€ฆ for update

    • ์ง€์ •๋œ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ฒ ํƒ€์  ์ž ๊ธˆ(exclusive lock)์„ ์„ค์ •

    • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๋Š” ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆ˜์ •์€ ๋ถˆ๊ฐ€๋Šฅ

    • ์ž ๊ธˆ์€ ํŠธ๋žœ์žญ์…˜์ด commit, rollback ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€

  2. record lock์˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ

    • update, delete, insert ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ž ๊ธˆ์ด ์ƒ์„ฑ

  • mysql์˜ isolation level์ด read committed๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, inset, delete, update ์ฟผ๋ฆฌ์—๋Š” ์ž๋™์œผ๋กœ exclusive lock์ด ์„ค์ •๋œ๋‹ค.

Gap lock

Gap lock์€ DB index record์˜ gap์— ๊ฑธ๋ฆฌ๋Š” lock์ด๋‹ค.

์—ฌ๊ธฐ์„œ gap์€ index ์ค‘, DB์— ์‹ค์ œ record๊ฐ€ ์—†๋Š” ๋ถ€๋ถ„์ด๋‹ค.

๋งŒ์•ฝ, id ์ปฌ๋Ÿผ๋งŒ ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ๊ณ , id ์ปฌ๋Ÿผ์— index๊ฐ€ ๊ฑธ๋ ค์žˆ๋‹ค๊ณ  ํ•˜๋ฉด, ํ˜„์žฌ ํ…Œ์ด๋ธ”์—๋Š” id = 3์ธ row์™€ id = 7์ธ row๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด DB์™€ index table์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ์ด๋‹ค.

์ด ๊ฒฝ์šฐ ํ˜„์žฌ id โ‰ค 2, 4 โ‰ค id โ‰ค 6, 8 โ‰ค id์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์—๋Š” index record๊ฐ€ ์—†๋‹ค. ์ด ๋ถ€๋ถ„์ด ๋ฐ”๋กœ index record์˜ gap์ด๋‹ค.

gap lock์€ ์ด๋Ÿฌํ•œ gap์— ๊ฑธ๋ฆฌ๋Š” lock์ด๋‹ค. ์ฆ‰, gap lock์€ ํ•ด๋‹น gap์— ์ ‘๊ทผํ•˜๋ ค๋Š” ๋‹ค๋ฅธ ์ฟผ๋ฆฌ์˜ ์ ‘๊ทผ์„ ๋ง‰๋Š”๋‹ค.

record lock์ด ํ•ด๋‹น index๋ฅผ ํƒ€๋ ค๋Š” ๋‹ค๋ฅธ ์ฟผ๋ฆฌ์˜ ์ ‘๊ทผ์„ ๋ง‰๋Š”๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค. ๋‘˜์˜ ์ฐจ์ด๋ผ๋ฉด record lock์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” row๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด๊ณ , gap lock์€ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ์ƒˆ๋กœ์šด row๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด c1์ด๋ผ๋Š” ์ปฌ๋Ÿผ์ด ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ” t1์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” c1 = 13, c1 = 17์ด๋ผ๋Š” ๋‘ row๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์œ„ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค๋ฉด, t1.c1์˜ ๊ฐ’์ด 10๊ณผ 20 ์‚ฌ์ด์ธ gap์— lock์ด ๊ฑธ๋ฆฐ๋‹ค. ์ฆ‰, 10 โ‰ค id โ‰ค 12, 14 โ‰ค di โ‰ค 16, 18 โ‰ค id โ‰ค 20์— ํ•ด๋‹นํ•˜๋Š” gap์— lock์ด ๊ฑธ๋ฆฐ๋‹ค.

์ด ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด t1.c1 = 15์ธ row๋ฅผ ์‚ฝ์ž…ํ•˜๋ ค๊ณ  ํ•˜๋ฉด gap lock ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜ A๊ฐ€ commit ๋˜๊ฑฐ๋‚˜ rollback ๋˜๊ธฐ ์ „๊นŒ์ง€ ์‚ฝ์ž…๋˜์ง€ ์•Š๋Š”๋‹ค. insert์™€ update, delete ์ฟผ๋ฆฌ์—์„œ๋„ ๋™์ผํ•˜๋‹ค.

Gap์€ ํ•˜๋‚˜์˜ index ๊ฐ’์ผ ์ˆ˜๋„, ์—ฌ๋Ÿฌ index์˜ ๊ฐ’์ผ ์ˆ˜๋„, ์•„์˜ˆ ์•„๋ฌด ๊ฐ’๋„ ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.

Lock์ด ํ•ด์ œ๋˜๋Š” ํƒ€์ด๋ฐ

ํŠธ๋žœ์žญ์…˜์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ InnoDB ์—”์ง„์€ ์œ„์ฒ˜๋Ÿผ ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ์— ๋งž๋Š” ์ˆ˜๋งŽ์€ lock์„ DB์— ๊ฑธ๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฌํ•œ lock์€ ๋ชจ๋‘ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ๋  ๋•Œ ํ•จ๊ป˜ unlock๋œ๋‹ค.

Consistent Read

Consistent read๋ž€ read operation์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ํ˜„์žฌ DB์˜ ๊ฐ’์ด ์•„๋‹Œ ํŠน์ • ์‹œ์ ์˜ DB Snapshot์„ ์ฝ์–ด์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

  • ์ด ์Šค๋ƒ…์ƒท์€ commit๋œ ๋ณ€ํ™”๋งŒ์ด ์ ์šฉ๋œ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

Consistent read๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์งˆ๊นŒ?

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•์€ ์ฝ์–ด์˜จ row์— lock์„ ๊ฑธ์–ด ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ InnoDB ์—”์ง„์€ consistent read๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด lock์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋™์‹œ์„ฑ์ด ๋งค์šฐ ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

InnoDB ์—”์ง„์€ ์‹คํ–‰ํ–ˆ๋˜ ์ฟผ๋ฆฌ์˜ log๋ฅผ ํ†ตํ•ด consistent read๋ฅผ ์ง€์›ํ•œ๋‹ค. InnoDB ์—”์ง„์€ ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ํ•œ ์ฟผ๋ฆฌ์˜ log๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์— consistent read๋ฅผ ํ•  ๋•Œ, ์ด log๋ฅผ ํ†ตํ•ด ํŠน์ • ์‹œ์ ์˜ DB Shapshot์„ ๋ณต๊ตฌํ•ด์„œ ๊ฐ€์ ธ์˜จ๋‹ค.

์ด ๋ฐฉ์‹์€ ๋น„๋ก ๋ณต๊ตฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ lock์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋ณด๋‹ค ๋†’์€ ๋™์‹œ์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

Isolation Level

Reapeatable Read

repeatable read๋Š” ๋ฐ˜๋ณตํ•ด์„œ read operation์„ ์ˆ˜ํ–‰ํ•˜๋”๋ผ๋„ ์ฝ์–ด ๋“ค์ด๋Š” ๊ฐ’์ด ๋ณ€ํ™”ํ•˜์ง€ ์•Š๋Š” ์ •๋„์˜ isolation์„ ๋ณด์žฅํ•˜๋Š” level์ด๋‹ค.

repeatable read ํŠธ๋žœ์žญ์…˜์€ ์ฒ˜์Œ์œผ๋กœ read(select) operation์„ ์ˆ˜ํ–‰ํ•œ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ดํ›„์— ๋ชจ๋“  read operation๋งˆ๋‹ค ํ•ด๋‹น ์‹œ์ ์„ ๊ธฐ์ค€์œผ๋กœ consistent read๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ ๋„์ค‘ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด commit์ด ๋˜๋”๋ผ๋„ ์ƒˆ๋กœ์ด commit๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ์ฒซ read ์‹œ์˜ ์Šค๋ƒ…์ƒท์„ ๋ณด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ผ๋ฐ˜์ ์ธ non-locking select ์™ธ์— lock์„ ์‚ฌ์šฉํ•˜๋Š” select, update, delete ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, repeatable read ํŠธ๋žœ์žญ์…˜์€ gap lock์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, ๋‚ด๊ฐ€ ์กฐ์ž‘ํ•˜๋ ค๋Š” row์˜ ํ›„๋ณด๊ตฐ์„ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๊ฑด๋“ค์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค.

์—ฌ๊ธฐ์— ๋Œ€ํ•ด์„œ๋Š” Repeatable read vs read commited๋ฅผ ๋น„๊ตํ—ค๋ด์•ผ ํ•œ๋‹ค.

  • Gap lock ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ next-key lock ์—ญ์‹œ ํ™œ์šฉํ•œ๋‹ค. ๋˜ํ•œ unique index์™€ unique search condition์„ ๊ฐ€์ง„ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋Š” gap lock์„ ๊ฑธ์ง€ ์•Š๋Š”๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด, where ์กฐ๊ฑด๋Œ€๋กœ index๋ฅผ ํƒ”์„ ๋•Œ ๋ฐ˜๋“œ์‹œ row๊ฐ€ ํ•˜๋‚˜ ์ดํ•˜๋งŒ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋Š” gap lock์„ ๊ฑธ์ง€ ์•Š๋Š”๋‹ค. ์–ด์ฐจํ”ผ row์˜ ํ›„๋ณด๊ตฐ์ด ํ•˜๋‚˜ ์ดํ•˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ •๋ฆฌ:

  • ํŠธ๋žœ์žญ์…˜ ๋‚ด ์ฒซ ์ฝ๊ธฐ ์ž‘์—… ์‹œ์ ์—์„œ ์Šค๋ƒ…์ƒท์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— phantom read๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

  • Gap lock ์‚ฌ์šฉ (๋‹จ, unique index์™€ unique search condition์—๋Š” ๋ฏธ์‚ฌ์šฉ)

Read Committed

Read committed๋Š” commit๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋ณด์ด๋Š” ์ˆ˜์ค€์˜ isolation์„ ๋ณด์žฅํ•˜๋Š” level์ด๋‹ค.

Repeatable read์˜ ํŠธ๋žœ์žญ์…˜์ด ์ฒซ read operation์„ ๊ธฐ์ค€์œผ๋กœ consistent๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ˜๋ฉด, Read committed์˜ ํŠธ๋žœ์žญ์…˜์€ read operation ๋งˆ๋‹ค DB Snapshot์„ ๋‹ค์‹œ ๋œฌ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด commit์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ์— ๋‹ค์‹œ read operation์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, Repeatable read์™€ ๋‹ค๋ฅด๊ฒŒ read committed์˜ ํŠธ๋žœ์žญ์…˜์€ ํ•ด๋‹น ๋ณ€ํ™”๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • ์ด ๋ง์€ select ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด commit ํ–ˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

  • ๋‹จ์ ์œผ๋กœ๋Š” ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด ์™„๋ฒฝํ•˜๊ฒŒ ๋ณด์žฅ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

โ€œcommit ๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋ณด๋Š” ๊ฑด ๋‹น์—ฐํ•œ๊ฑฐ ์•„๋‹Œ๊ฐ€?โ€ ํ˜น์€ โ€œselect ์ฟผ๋ฆฌ๋งˆ๋‹ค ์Šค๋ƒ…์ƒท์„ ๋‹ค์‹œ ๋œจ๋ฉด ๋‹ค์Œ read์—์„œ ๋ณต๊ตฌ๊ฐ€ ํ•„์š” ์—†๋Š”๋ฐ ์Šค๋ƒ…์ƒท์„ ์™œ ๋œจ๋Š”๊ฑฐ์•ผ?โ€ ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ DB์—๋Š” ์•„์ง commit ๋˜์ง€ ์•Š์€ ์ฟผ๋ฆฌ๋„ ์ ์šฉ๋œ ์ƒํƒœ์ด๋‹ค. ๋”ฐ๋ผ์„œ commit ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์–ด์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„์ง commit ๋˜์ง€ ์•Š์€ ์ฟผ๋ฆฌ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

์ฆ‰, consistent read๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์ธ non-locking select ์™ธ์— lock์„ ์‚ฌ์šฉํ•˜๋Š” select, update, delete ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, read committed์˜ ํŠธ๋žœ์žญ์…˜์€ record lock๋งŒ ์‚ฌ์šฉํ•˜๊ณ  gap lock์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ phantom read๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌ:

  • Read Committed ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ๊ฐ ์ฝ๊ธฐ ์ž‘์—…๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์Šค๋ƒ…์ƒท์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์ฝ๊ธฐ๊ฐ€ ์žˆ๋Š”๊ฒฝ์šฐ, ๊ฐ ์ฝ๊ธฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. (ํŒฌํ…€ ๋ฆฌ๋“œ)

  • Gap lock ๋ฏธ์‚ฌ์šฉ, record lock๋งŒ ์‚ฌ์šฉ

Repeatable Read vs Read Committed

์•„๋ž˜๋Š” Phantom read๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค.

c1 ์ปฌ๋Ÿผ์ด ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ” t1์ด ์žˆ๋‹ค. ํ˜„์žฌ t1์—๋Š” t1.c1 = 13์ธ row์™€ t1.c1 = 17์ธ row๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ Read Committed์ธ ํŠธ๋žœ์žญ์…˜ A์™€ B๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๋‘ ํŠธ๋žœ์žญ์…˜์€ ์œ„์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์‹คํ–‰๋œ๋‹ค.

(A-1) ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋œ ๊ฒฝ์šฐ, ๊ฒฐ๊ณผ๋Š” ๋‹น์—ฐํžˆ t1.c1 = 13์ธ row์™€ t1.c1 = 17์ธ row 2๊ฐœ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด lock์€ ์–ด๋–ป๊ฒŒ ๊ฑธ๋ ค์žˆ์„๊นŒ?

Read committed ํŠธ๋žœ์žญ์…˜์€ record lock๋งŒ ๊ฑธ๊ณ  gap lock์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ (A-1)๋ฒˆ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋œ ์งํ›„ ๊ฑธ๋ ค์žˆ๋Š” lock์€ t1.c1 = 13๊ณผ t1.c1 = 17 ์— ๋Œ€ํ•œ record lock์ด๋‹ค.

  • for update๋Š” ์„ ํƒ๋œ ํ–‰์— ๋Œ€ํ•˜์—ฌ ๋ฒ ํƒ€์  ์ž ๊ธˆ(exclusive lock)์„ ๊ฑธ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ด ๋•Œ ํŠธ๋žœ์žญ์…˜ B๊ฐ€ t1.c1 = 15์ธ row๋ฅผ ์‚ฝ์ž…ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. (B-1)

ํŠธ๋žœ์žญ์…˜ A๋Š” gap lock์„ ๊ฑธ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜ B๋Š” ์ž์œ ๋กญ๊ฒŒ t1.c1 = 15์ธ row๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ ํŠธ๋žœ์žญ์…˜ B๋Š” commit์„ ์ง„ํ–‰ํ•œ๋‹ค. (B-2)

๋‹ค์‹œ ํŠธ๋žœ์žญ์…˜ A๊ฐ€ (A-2) ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํŠธ๋žœ์žญ์…˜ A์˜ Isolation level์€ Read committed ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กญ๊ฒŒ shapshot์„ ๊ฐฑ์‹ ํ•ด์˜จ๋‹ค. ์—ฌ๊ธฐ์„œ ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ์‚ฝ์ž…ํ•œ t1.c1 = 15์ธ row๋ฅผ ์ฝ์–ด ๋“ค์ธ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ phantom row์ด๋‹ค.

  • ์ด ์ƒํ™ฉ์ด phantom read์ธ ์ด์œ ๋Š”, ํŠธ๋žœ์žญ์…˜ A(๊ฐ™์€ ํŠธ๋žœ์žญ์…˜) ๋‚ด์—์„œ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, (A-1), (A-2)์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋–„๋ฌธ์ด๋‹ค. ์ฆ‰, ๋‘ ๋ฒˆ์งธ ์‹คํ–‰ ๊ฒฐ๊ณผ์—์„œ ์ฒ˜์Œ์— ์—†๋˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งŒ์•ฝ ํŠธ๋žœ์žญ์…˜ A์˜ Isolation level์ด Repeatable read๋ผ๊ณ  ํ•˜๋ฉด, (B-1) ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋  ๋•Œ, t1.c1 = 15์ธ gap์— gap lock์ด ๊ฑธ๋ ค์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ํŠธ๋žœ์žญ์…˜ B๋Š” ํŠธ๋žœ์žญ์…˜ A๊ฐ€ commit ๋˜์–ด lock์„ ํ•ด์ œํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ , phantom read๋Š” ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์—…๋ฐ์ดํŠธ ํ•˜๋ ค๋Š” 10 โ‰ค t1.c1 โ‰ค 20์— ํ•ด๋‹นํ•˜๋Š” row์˜ ํ›„๋ณด๊ตฐ์ด ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค.

Read Uncommited

Read Uncommitted ํŠธ๋žœ์žญ์…˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Read committed ํŠธ๋žœ์žญ์…˜๊ณผ ๋™์ผํ•˜๋‹ค.

๋Œ€์‹ , select ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์•„์ง commit ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

  1. ํŠธ๋žœ์žญ์…˜ A์—์„œ row๋ฅผ ์‚ฝ์ž…

  2. read uncommitted ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ํ•ด๋‹น row๋ฅผ ์ฝ๋Š”๋‹ค.

  3. ํŠธ๋žœ์žญ์…˜ A๊ฐ€ rollback ๋œ๋‹ค.

์ด ๊ฒฝ์šฐ, ํŠธ๋žœ์žญ์…˜ B๋Š” ์‹ค์ œ๋กœ DB์— ํ•œ ๋ฒˆ๋„ commit ๋˜์ง€ ์•Š์€, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ๋“ค์˜€๋‹ค. ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ Dirty Read๋ผ๊ณ  ํ•œ๋‹ค.

์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” InnoDB ์—”์ง„์ด ํŠธ๋žœ์žญ์…˜์„ commit ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋•Œ๋ฌธ์ด๋‹ค.

InnoDB ์—”์ง„์€ ์ผ๋‹จ ์‹คํ–‰๋œ ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฅผ DB์— ์ ์šฉํ•œ๋‹ค. ๊ทธ๊ฒƒ์ด ์•„์ง commit ๋˜์ง€ ์•Š์€ ํŠธ๋žœ์žญ์…˜์ด์–ด๋„ ์ ์šฉํ•œ๋‹ค. ์ฆ‰, ํŠน๋ณ„ํžˆ log๋ฅผ ๋ณด๊ณ  ํŠน์ • ์‹œ์ ์˜ snapshot์„ ๋ณต๊ตฌํ•˜๋Š” consistent read๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ํ•ด๋‹น ์‹œ์ ์˜ DB๋ฅผ ์ฝ์œผ๋ฉด dirty read๊ฐ€ ๋œ๋‹ค.

Serializable

Serializable ํŠธ๋žœ์žญ์…˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ repeatable read์™€ ๋™์ผํ•˜๋‹ค. ๋Œ€์‹ ์— select ์ฟผ๋ฆฌ๊ฐ€ ์ „๋ถ€ select โ€ฆ for share๋กœ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

์ด๋Š” repeatable read์—์„œ ๋ง‰์„ ์ˆ˜ ์—†๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋จผ์ €, (A-1)๋ฒˆ select ์ฟผ๋ฆฌ๊ฐ€ select โ€ฆ for share๋กœ ๋ฐ”๋€Œ๋ฉด์„œ id = 1 ์ธ row์— S-lock์ด ๊ฑธ๋ฆฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  (B-1)๋ฒˆ select ์ฟผ๋ฆฌ ์—ญ์‹œ id = 1 ์ธ row์— S-lock์„ ๊ฑด๋‹ค. ์ด ์ƒํ™ฉ์—์„œ ํŠธ๋žœ์žญ์…˜ A์™€ B๊ฐ€ ๊ฐ๊ฐ 2๋ฒˆ์˜ update ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, row์— X-lock์„ ๊ฑธ๋ ค๊ณ  ์‹œ๋„ํ•  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฏธ ํ•ด๋‹น row์—๋Š” S-lock์ด ๊ฑธ๋ ค์žˆ๊ธฐ ๋•Œ๋ฌธ์— deadlock ์ƒํ™ฉ์— ๋น ์ง€๊ณ , ๋‘ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋‘ timeout์œผ๋กœ ์‹คํŒจํ•  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ money๋Š” 1๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋‚จ์•„์žˆ๋‹ค.

์ด ๊ฒฝ์šฐ๋กœ ๋ดค์„ ๋•Œ, Serializable isolation level์€ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ต‰์žฅํžˆ ์‰ฝ๊ฒŒ deadlock์— ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ๋ฐ๋“œ๋ฝ์ด ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”์ง€ ์‹ ์ค‘ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Serializable์ด ์•„๋‹ˆ๋ฉด update, delete์— ์ฃผ์˜ํ•ด๋ผ.

ํ•˜๋‚˜ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ DML, ์ฆ‰ update๋‚˜ delete๋Š” consistent read์˜ ์ ์šฉ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

์ฆ‰, ๊ฐ™์€ where ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ์ˆ˜์ •ํ•˜๋ ค๊ณ  select ์ฟผ๋ฆฌ๋กœ ์ฝ์–ด์˜จ row์™€ ํ•ด๋‹น row๋“ค์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด update ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ธ์„ ๋•Œ ์‹ค์ œ๋กœ ์ˆ˜์ •๋˜๋Š” row๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด 2๊ฐœ์˜ repeatable read ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•˜์ž.

๋‘ ํŠธ๋žœ์žญ์…˜์ด ์œ„์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์‹คํ–‰๋  ๋•Œ, ์ฒ˜์Œ์— ํ…Œ์ด๋ธ” t1์ด ๋น„์–ด์žˆ๋‹ค๋ฉด (A-1)๋ฒˆ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” 0์ด๋‹ค. ์ด ๋•Œ ์‹คํ–‰๋œ ์ฟผ๋ฆฌ๋Š” non-locking select ์ฟผ๋ฆฌ์ด๋ฏ€๋กœ lock์€ ๊ฑธ๋ ค์žˆ์ง€ ์•Š๋‹ค.

๋•๋ถ„์— ํŠธ๋žœ์žญ์…˜ B๋Š” ์ž์œ ๋กญ๊ฒŒ t1.c1 = โ€˜xyzโ€™์ธ row๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ (A-1)๋ฒˆ ์ฟผ๋ฆฌ์—์„œ t1.c1 = โ€˜xyzโ€™์ธ row๊ฐ€ 0๊ฐœ ์˜€๊ณ , ๊ฐ™์€ where ์กฐ๊ฑด์œผ๋กœ delete ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์Œ์—๋„ (A-2)๋ฒˆ ์ฟผ๋ฆฌ๋Š” 3๊ฐœ์˜ row๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

๋งŒ์•ฝ ์œ„ ์ƒํ™ฉ์ฒ˜๋Ÿผ consistent read์—๋Š” ๋ณด์ด์ง€ ์•Š๋Š” row์— update์™€ delete ์ฟผ๋ฆฌ๋กœ ์˜ํ–ฅ์„ ์ค€ ๊ฒฝ์šฐ, ๊ทธ ์‹œ์  ์ดํ›„๋กœ๋Š” ํ•ด๋‹น row๊ฐ€ ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

ํŠธ๋žœ์žญ์…˜ B๊ฐ€ c1 = โ€˜abcโ€™ ์ธ row๋ฅผ ๋ช‡ ๊ฐœ ์‚ฝ์ž…ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•„๊นŒ ์ „ ์˜ˆ์‹œ์™€ ๋™์ผํ•˜๊ฒŒ (A-2)๋ฒˆ ์ฟผ๋ฆฌ๋Š” (A-1) ์ฟผ๋ฆฌ์—์„œ ๋ณด์ด์ง€ ์•Š์•˜๋˜ row๋ฅผ ์ˆ˜์ •ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ์ˆœ๊ฐ„๋ถ€ํ„ฐ ํŠธ๋žœ์žญ์…˜ A์—์„œ๋Š” ์ด row๋“ค์ด ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ (A-3)์˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋Š” 3์ด ๋œ๋‹ค.

๋งŒ์•ฝ ๋‘ ์˜ˆ์‹œ์—์„œ transaction isolation level์ด serializable ์ด์—ˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?

์•ž์— ๋ชจ๋“  select ์ฟผ๋ฆฌ๋Š” select โ€ฆ for share๋กœ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ์˜ˆ์‹œ ๋ชจ๋‘์—์„œ (A-1)๋ฒˆ ์ฟผ๋ฆฌ๋Š” record S-lock์„ ๊ฑธ์—ˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํŠธ๋žœ์žญ์…˜ B์—์„œ update ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ X-lock์„ ๊ฑธ๋ ค๊ณ  ํ•  ๋•Œ, ์ด๋ฏธ ํ•ด๋‹น record์—๋Š” S-lock์ด ๊ฑธ๋ ค์žˆ์œผ๋ฏ€๋กœ ์ˆ˜์ •๋˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋น ์ง„๋‹ค.*

๋”ฐ๋ผ์„œ ํŠธ๋žœ์žญ์…˜ A์˜ (A-2)๋ฒˆ ์ฟผ๋ฆฌ๋Š” ์•ˆ์ „ํ•˜๊ฒŒ (A-1)๋ฒˆ ์ฟผ๋ฆฌ์—์„œ ๋ณธ row๋งŒ ์ˆ˜์ •ํ•œ๋‹ค.

* ๋ถ€๋ถ„์€ t1.c1 ์ปฌ๋Ÿผ์— index๊ฐ€ ๊ฑธ๋ ค์žˆ๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•œ ์ƒํ™ฉ์ด๋‹ค. ํ•˜์ง€๋งŒ index๊ฐ€ ๊ฑธ๋ ค์žˆ์ง€ ์•Š์€ ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด์„œ ํ…Œ์ŠคํŠธ ํ–ˆ์„ ๋•Œ์—๋„ ํŠธ๋žœ์žญ์…˜ B๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋น ์กŒ๋‹ค. ์ด๋•Œ ๊ฑธ๋ ค์žˆ๋Š” lock์„ ํ™•์ธํ•ด๋ณด๋ฉด ํŠธ๋žœ์žญ์…˜ A๊ฐ€ pk ๋•Œ๋ฌธ์— ์ƒ์„ฑ๋œ index์— lock์„ ๊ฑด ๊ฒƒ์ด๋‹ค. ์ถ”์ธก์ปจ๋Œ€, where ์กฐ๊ฑด์— index๊ฐ€ ์—†๋Š” ์ปฌ๋Ÿผ๋งŒ ํฌํ•จ๋  ๋•Œ locking select๋ฅผ ํ•  ๊ฒฝ์šฐ ํ•ด๋‹น row์˜ pk index์— lock์„ ๊ฑฐ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

Last updated