๊ด€๋ฆฌ ๋ฉ”๋‰ด

Binary Journey

[๋งค์ผ๋ฉ”์ผ] ๊ฐญ๋ฝ(Gap Lock)๊ณผ ๋„ฅ์ŠคํŠธํ‚ค ๋ฝ(Next-Key Lock)์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์–ด๋–ป๊ฒŒ Phantom Read๋ฅผ ๋ฐฉ์ง€ํ•˜๋‚˜์š”? ๋ณธ๋ฌธ

daily/maeil-mail challenge

[๋งค์ผ๋ฉ”์ผ] ๊ฐญ๋ฝ(Gap Lock)๊ณผ ๋„ฅ์ŠคํŠธํ‚ค ๋ฝ(Next-Key Lock)์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์–ด๋–ป๊ฒŒ Phantom Read๋ฅผ ๋ฐฉ์ง€ํ•˜๋‚˜์š”?

binaryJournalist 2024. 12. 20. 13:58
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ๋งค์ผ๋ฉ”์ผ์€ ๊ธฐ์ˆ ๋ฉด์ ‘ ๊ด€๋ จ ์งˆ๋ฌธ์„ ๋ฉ”์ผ๋กœ ๋งค์ผ ๋ณด๋‚ด์ฃผ๋Š” ๊ตฌ๋… ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก๋งค์ผ๋ฉ”์ผ ์ฑŒ๋ฆฐ์ง€๋Š” ์ œ ๊ฐœ์ธ์ ์ธ ์ฑŒ๋ฆฐ์ง€๋กœ ๋งค์ผ๋ฉ”์ผ์—์„œ ๋ณด๋‚ด์ฃผ๋Š” ํ•˜๋ฃจ์น˜ ๋ฉ”์ผ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐญ๋ฝ(Gap Lock)๊ณผ ๋„ฅ์ŠคํŠธํ‚ค ๋ฝ(Next-Key Lock)์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์–ด๋–ป๊ฒŒ Phantom Read๋ฅผ ๋ฐฉ์ง€ํ•˜๋‚˜์š”?

(2024.12.19 ์งˆ๋ฌธ)

๋‚˜์˜ ๋‹ต์•ˆ

๊ฐญ ๋ฝ(Gap Lock์€ ํŠน์ • ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ทธ๋Š” ๋ฒ”์œ„ ๋ฝํ‚น ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋™์ผํ•œ ๋ฒ”์œ„์˜ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์— ์‚ฝ์ž…๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋„ฅ์ŠคํŠธํ‚ค ๋ฝ(Next-Key Lock)์€ Record Lock(๋ ˆ์ฝ”๋“œ ๋ฝ)๊ณผ Gap Lock์˜ ์กฐํ•ฉ์œผ๋กœ ํŠน์ • ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ธ€ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์•ž๋’ค ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ๋„ ํ•จ๊ป˜ ์ž ๊ทธ๋Š” ๋ฝํ‚น ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

 

Phantom Read๋Š” ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ, ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์‚ญ์ œ ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด "์œ ๋ น(Phantom)" ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

 

 

employees ํ…Œ์ด๋ธ”์ด ์•„๋ž˜์™€ ๊ฐ™๊ณ  salary ์ปฌ๋Ÿผ์— ๋‹จ์ผ ์ธ๋ฑ์Šค๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

name salary
A 50,000
B 70,000
C 90,000

 

 

 

Transaction A์—์„œ salary๊ฐ€ 60,000๋ถ€ํ„ฐ 80,000๊นŒ์ง€์ธ ์ง์› ์กฐํšŒ ์‹œ

-- Transaction A
SELECT * FROM employees WHERE salary BETWEEN 60,000 AND 80,000 FOR UPDATE;

 

 

 

์กฐํšŒ ์ถœ๋ ฅ๊ฐ’์€ 70,000์ด ๋˜๋ฉฐ

 

 

๊ฐญ ๋ฝ(Gap Lock)์˜ ๊ฒฝ์šฐ

 

์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ทธ๊ธฐ ๋•Œ๋ฌธ์— 50,000 - 70,000๊ณผ 70,000 - 90,000 ๊ตฌ๊ฐ„์„ ์ž ๊ธ‰๋‹ˆ๋‹ค.


๋งŒ์•ฝ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์ธ Transaction B์—์„œ ์ž ๊ธด ๊ตฌ๊ฐ„ ๋‚ด์˜ salary๊ฐ’์„ ๊ฐ€์ง„ ์ง์› ๋ ˆ์ฝ”๋“œ insert ๋ช…๋ น์€ ์ฐจ๋‹จ๋˜์–ด ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ ์‚ฝ์ž…๋กœ ์ธํ•œ Phantom Read ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- ๊ฐญ ๋ฝ(Gap Lock) ์ƒํƒœ์—์„œ Transaction B ์‹œ๋„
INSERT INTO employees VALUES (์ด๋ฆ„, 75,000); -- ์ฐจ๋‹จ๋จ
INSERT INTO employees VALUES (์ด๋ฆ„, 65,000); -- ์ฐจ๋‹จ๋จ

 

 

 

๋„ฅ์ŠคํŠธํ‚ค ๋ฝ(Next-Key Lock)์˜ ๊ฒฝ์šฐ

 

๊ฐญ ๋ฝ(Gap Lock)๊ณผ ๋ ˆ์ฝ”๋“œ ๋ฝ(Record Lock)์ด ๊ฐ™์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒ ๋ถ€๋ถ„์ธ ๊ฐœ๋ณ„ ์ธ๋ฑ์Šค 70,000 ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทธ๊ณ  ์•ž์„œ ๊ฐญ ๋ฝ(Gap Lock)์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์ธ 50,000 - 70,000๊ณผ 70,000 - 90,000 ๊ตฌ๊ฐ„์„ ์ž ๊ธ‰๋‹ˆ๋‹ค.
์ด ์ƒํƒœ์—์„œ salary๊ฐ€ 70,000์ธ ๋ ˆ์ฝ”๋“œ๋ฅผ updateํ•˜๊ฑฐ๋‚˜ 50,000 - 70,000๊ณผ 70,000 - 90,000 ๊ตฌ๊ฐ„์˜ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ insert์‹œ ๋ช…๋ น์€ ์ฐจ๋‹จ๋˜์–ด Phantom Read๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- ๋„ฅ์ŠคํŠธํ‚ค ๋ฝ(Next-Key Lock) ์ƒํƒœ์—์„œ Transaction B ์‹œ๋„
UPDATE employees SET salary = 75,000 WHERE salary = 70,000; -- ์ฐจ๋‹จ๋จ
INSERT INTO employees VALUES (์ด๋ฆ„, 75,000); -- ์ฐจ๋‹จ๋จ
DELETE FROM employees WHERE salary = 70,000; -- ์ฐจ๋‹จ๋จ

 

 


 

๋ชจ๋ฒ” ๋‹ต์•ˆ

 

 


 

์งˆ๋ฌธ์˜ ๋ชฉ์ 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋™์‹œ์„ฑ ์ œ์–ด์™€ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฝํ‚น ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด, ๋™์‹œ์„ฑ์€ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์•ˆ์ •์ ์ธ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


 

์ฃผ์š” ๊ฐœ๋…

 

Phantom Read

ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ, ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์‚ญ์ œ ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด "์œ ๋ น(Phantom)" ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
์ฃผ๋กœ ์ฝ๊ธฐ ์ผ๊ด€์„ฑ(Read Consistency) ์„ ์œ ์ง€ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

-- Transaction A
SELECT * FROM employees WHERE salary BETWEEN 1000 AND 2000; -- 10๊ฑด ์กฐํšŒ
-- Transaction B๊ฐ€ ์ƒˆ ์ง์› ์ถ”๊ฐ€
SELECT * FROM employees WHERE salary BETWEEN 1000 AND 2000; -- 11๊ฑด ์กฐํšŒ

 

๊ฐญ๋ฝ(Gap Lock)

  • ํŠน์ • ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ทธ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๊ฐ€ ๊ทธ ๊ฐ„๊ฒฉ์— ์‚ฝ์ž…๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐญ๋ฝ์€ ๋ ˆ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์•„๋‹Œ ๋ ˆ์ฝ”๋“œ ๊ฐ„์˜ ๊ฐ„๊ฒฉ(gap)์„ ์ž ๊ทธ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋™์ผํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์Šต๋‹ˆ๋‹ค.
    • ๊ธฐ์กด ๋ ˆ์ฝ”๋“œ ๊ฐ„์˜ ๊ฐ„๊ฒฉ์„ ๋ณดํ˜ธํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ์˜ ์‚ฝ์ž…์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐญ ๋ฝ์€ ๋ฒ”์œ„ ๋‚ด์— ํŠน์ • ๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ํŠธ๋žœ์žญ์…˜์ด ํŠน์ • ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…์„ ๋ง‰์•„ ํŒฌํ…€ ์ฝ๊ธฐ(Phantom Read) ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ: salary ์ธ๋ฑ์Šค์—์„œ 1000๊ณผ 2000 ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ทธ๋ฉด, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์€ ์ด ๋ฒ”์œ„์— ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

 

๋„ฅ์ŠคํŠธํ‚ค ๋ฝ(Next-Key Lock)

  • Record Lock(๋ ˆ์ฝ”๋“œ ๋ฝ)๊ณผ Gap Lock์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ • ๋ ˆ์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์™€ ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐญ๋„ ์ž ๊ทธ๋Š” ์ž ๊ธˆ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    • ํŠน์ • ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ์™€ ๊ทธ ์ฃผ๋ณ€์˜ ๊ฐญ์„ ๋™์‹œ์— ์ž ๊ทธ๋Š” ๋ฝ์ž…๋‹ˆ๋‹ค.
    • ๋ ˆ์ฝ”๋“œ ์ž์ฒด์˜ ๋ณ€๊ฒฝ๊ณผ ํ•จ๊ป˜ ๊ทธ ์ฃผ๋ณ€ ๊ณต๊ฐ„์˜ ๋ณ€๊ฒฝ๋„ ๋™์‹œ์— ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋„ฅ์ŠคํŠธํ‚ค ๋ฝ์€ ํŠน์ • ๋ ˆ์ฝ”๋“œ์™€ ๊ทธ ์ฃผ๋ณ€ ๊ณต๊ฐ„์„ ์ž ๊ทธ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ํŒฌํ…€ ๋ฆฌ๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • InnoDB์˜ ๊ธฐ๋ณธ ์ž ๊ธˆ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

-- salary ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •
SELECT * FROM employees WHERE salary BETWEEN 1000 AND 2000 FOR UPDATE;
  1. salary๊ฐ€ 1000-2000 ๋ฒ”์œ„์˜ ์‹ค์ œ ๋ ˆ์ฝ”๋“œ๋“ค์„ ์ž ๊ทธ๊ณ  (Record Lock)
  2. ํ•ด๋‹น ๋ฒ”์œ„ ๋‚ด์˜ ๋ชจ๋“  ๊ฐ„๊ฒฉ์„ ์ž ๊ธ‰๋‹ˆ๋‹ค (Gap Lock)
  3. ๊ฒฐ๊ณผ์ ์œผ๋กœ Next-Key Lock์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

๋ ˆ์ฝ”๋“œ ๋ฝ(Record Lock)

๋ ˆ์ฝ”๋“œ ๋ฝ(Record Lock)์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ–‰ ๋‹จ์œ„ ์ž ๊ธˆ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ๊ฐœ๋ณ„ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ž ๊ธˆ์ž…๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ญ์ƒ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ธ‰๋‹ˆ๋‹ค (ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค๋ฉด ์ˆจ๊ฒจ์ง„ ํด๋Ÿฌ์Šคํ„ฐํ˜• ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉ)
-- Transaction A
SELECT * FROM users WHERE id = 1 FOR UPDATE;
-- ์ด ์‹œ์ ์—์„œ id๊ฐ€ 1์ธ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ ˆ์ฝ”๋“œ ๋ฝ์ด ์„ค์ •๋จ

-- Transaction B๋Š” ์ด ์‹œ์ ์—์„œ ๋™์ผ ๋ ˆ์ฝ”๋“œ ์ˆ˜์ • ๋ถˆ๊ฐ€
UPDATE users SET name = 'New Name' WHERE id = 1; 
-- Transaction B๋Š” Transaction A๊ฐ€ ์ปค๋ฐ‹๋˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ

 

๊ฐญ ๋ฝ(Gap Lock)๊ณผ์˜ ์ฐจ์ด

  • ๋ ˆ์ฝ”๋“œ ๋ฝ: ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ ์ž ๊ทธ๋ฉฐ ํŠน์ • ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์„ ๋ง‰์Šต๋‹ˆ๋‹ค.
  • ๊ฐญ ๋ฝ: ๋ ˆ์ฝ”๋“œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ž ๊ธˆ. ํŠน์ • ์ธ๋ฑ์Šค ๋ฒ”์œ„์˜ "์‚ฌ์ด"๋ฅผ ์ž ๊ทธ๋ฉฐ, ํ•ด๋‹น ๋ฒ”์œ„ ๋‚ด์—์„œ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ ์‚ฝ์ž…์ด๋‚˜ ์‚ญ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ฐญ๋ฝ์˜ ํŠน์ง•

  • ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋Š” ๊ฐญ๋ฝ์— ์˜ํ•ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์—์„œ ๋ฐœ์ƒํ•˜๋ฉฐ, ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‚ฝ์ž…, ์‚ญ์ œ์™€ ๊ฐ™์€ ํŒฌํ…€ ๋ฆฌ๋“œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐญ๋ฝ์€ ๋ ˆ์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค ๋ฒ”์œ„ ์ „์ฒด๋ฅผ ์ž ๊ทธ๋ฏ€๋กœ, ๋™์‹œ์„ฑ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ๋ฒ”์œ„ ๊ฒ€์ƒ‰ ์‹œ ๋ฐ๋“œ๋ฝ(Deadlock)์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

๋„ฅ์ŠคํŠธํ‚ค ๋ฝ(Next-Key Lock)๊ณผ์˜ ์ฐจ์ด

  • ๋ ˆ์ฝ”๋“œ ๋ฝ: ๋‹จ์ผ ๋ ˆ์ฝ”๋“œ๋งŒ ์ž ๊ธ‰๋‹ˆ๋‹ค.
  • ๋„ฅ์ŠคํŠธํ‚ค ๋ฝ: ๋ ˆ์ฝ”๋“œ์™€ ๊ทธ ์•ž์˜ ๊ฐญ์„ ํ•จ๊ป˜ ์ž ๊ธ‰๋‹ˆ๋‹ค.

๋„ฅ์ŠคํŠธํ‚ค๋ฝ์˜ ํŠน์ง•

  • ํŠน์ • ๋ ˆ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ๋ฐฉ์ง€(Record Lock)
  • ํŠน์ • ๋ฒ”์œ„์—์„œ ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ ์‚ฝ์ž…์„ ๋ฐฉ์ง€(Gap Lock)
  • ๋ ˆ์ฝ”๋“œ ์ž์ฒด์™€ ๊ฐญ ๋ชจ๋‘๋ฅผ ์ž ๊ธˆ์œผ๋กœ์จ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜์—ฌ ํŒฌํ…€ ๋ฆฌ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋„ฅ์ŠคํŠธํ‚ค๋ฝ์ด ์•„๋‹Œ ํ…Œ์ด๋ธ”๋ฝ์ด ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • MySQL์—์„œ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ธ REPEATABLE READ์—์„œ ํŒฌํ…€ ๋ฆฌ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„ฅ์ŠคํŠธ ํ‚ค ๋ฝ์ด ํ™œ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋งŒ ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

 

Phantom Read ์™€ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

Phantom Read ๋ฐœ์ƒ ๊ฐ€๋Šฅ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

  • Read Committed: ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜๋ณต์ ์ธ ์ฝ๊ธฐ์—์„œ ํŒฌํ…€ ํ–‰์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Repeatable Read: ํ•œ ๋ฒˆ ์ฝ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ฝํž ๋•Œ๋Š” ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ํ–‰์ด ์‚ฝ์ž…๋˜์–ด ํŒฌํ…€ ํ–‰์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Serializable ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” Phantom Read๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ˆ˜์ค€์—์„œ๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ์— ๋Œ€ํ•ด ๋ฒ”์œ„ ์ž ๊ธˆ(range lock) ์„ ์ ์šฉํ•˜๋ฏ€๋กœ, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋ฒ”์œ„ ๋‚ด์—์„œ ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฐฑ์‹ ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•