[DB] Select For Update ๋ž€? (feat. ์กฐํšŒ์™€ ์—…๋ฐ์ดํŠธ)

2024. 9. 6. 11:11ใ†๐Ÿ’กDatabase

SELECT ~ FOR UPDATE  ๋ž€

์ผ๋ฐ˜์ ์ธ SELECT ๊ตฌ๋ฌธ์€ ๋ฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฝ์„ ํš๋“ํ•˜์ง€ ์•Š์•„๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์ฃ .

ํ•˜์ง€๋งŒ ๊ฐ„ํ˜น ์กฐํšŒ ์‹œ์ ์—๋„ ๋ฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ •์‚ฐ ์‹œ์ ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์ •์‚ฐ์‹œ๊ฐ„ ๋™์•ˆ์€ ํ•ด๋‹น ์กฐํšŒ ํŠธ๋žœ์žญ์…˜์—์„œ read ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ๊ณณ์—์„œ ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ์—” SELECT FOR UPDATE ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด ์กฐํšŒ ์ค‘ ์ˆ˜์ •์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด '๋‚ด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋™์•ˆ์€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€๋งˆ!' ๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ ,
๊ธฐ์ˆ ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•ด ํŠน์ • Row ์— ๋ฐฐํƒ€์  LOCK ์„ ๊ฑฐ๋Š” ๊ฒƒ์ด๋ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์‹ค์Šต

 

 

server_info ํ…Œ์ด๋ธ” ๋Œ€์ƒ์œผ๋กœ Select for update ์ฟผ๋ฆฌ๋ฅผ ์‹คํ—˜ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

available ๊ฐ’์ด false(=0) ์ธ ๋กœ์šฐ๊ฐ€ ์กด์žฌํ•  ๋•Œ, ๋‘๊ฐœ์˜ ์ฝ˜์†”์—์„œ ๊ฐ๊ฐ ์กฐํšŒ์™€ ์—…๋ฐ์ดํŠธ๋ฅผ ์‹คํ–‰ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

console_2 ์—์„  select for update ๋ฅผ, console_3 ๋Š” select ์™€ update ๋ช…๋ น์–ด๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ด ๋•Œ console_2 ๋Š” set autocommit = false; ๋ฅผ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ํ•ด๋‹น ์„ค์ •์ด ์—†์œผ๋ฉด ์ฝ˜์†”์—์„œ ๋ช…๋ น์–ด ๋ผ์ธ์ด ์ˆ˜ํ–‰๋˜๋Š” ์ฆ‰์‹œ ์ž๋™์œผ๋กœ ์ปค๋ฐ‹๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

select for update ๊ตฌ๋ฌธ์ด ์‹คํ–‰ ํ›„ ์ปค๋ฐ‹๋˜์ง€ ์•Š์œผ๋ฉด ์—ฌ์ „ํžˆ ๋ฝ์„ ๋ฌผ๊ณ  ์žˆ๋Š” ๊ฒƒ์ธ์ง€ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์ปค๋ฐ‹์ด ์™„๋ฃŒ๋˜๋ฉด select for update ๊ตฌ๋ฌธ์ด ๋ฌผ๊ณ  ์žˆ๋Š” ๋ฝ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์šฐ์„  console_2 ๋งŒ ์‹คํ–‰ํ•˜๋ฉด ์ด๋ฏธ์ง€ ๊ฐ€์žฅ ํ•˜๋‹จ์— ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ select for update ๊ตฌ๋ฌธ์ด ์—ฌ์ „ํžˆ ๋ฝ์„ ๋ฌผ๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์—์„œ 1)์กฐํšŒ์™€ 2)์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

console_3 ๋Š” ๊ฐ๊ฐ ์กฐํšŒ ์ฟผ๋ฆฌ์™€ ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ๊ฐ€ ์ž‘์„ฑ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ฝ˜์†”์„ ์‹คํ–‰ํ•˜๋ฉด ์šฐ์„  ์กฐํšŒ ์ฟผ๋ฆฌ๋Š” ์™„๋ฃŒ๋๋‹ค๋Š” โœ…์ดˆ๋ก์ƒ‰ ์ฒดํฌ๊ฐ€ ํ‘œ์‹œ๋˜์ง€๋งŒ, ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ๐Ÿ’ฌ ๋Œ€๊ธฐ์ค‘์ด๋ผ๋Š” ํ‘œ์‹œ๊ฐ€ ๋œน๋‹ˆ๋‹ค.

 

์ฆ‰ Select For Update ๋กœ ์ธํ•ด ๋ฝ์ด ๊ฑธ๋ฆฌ๋”๋ผ๋„ ์กฐํšŒ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์—…๋ฐ์ดํŠธ๋Š” ๋ฝ์ด ๋ฐ˜๋‚ฉ๋  ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ console_2 ์—์„œ commit ์„ ์ž…๋ ฅํ•˜๋ฉด console_3 ์˜ ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ๋„ ์ฆ‰์‹œ ์ปค๋ฐ‹๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

๋งˆ๋ฌด๋ฆฌ

์œ„ ๊ณผ์ •์„ ์ด๋ฏธ์ง€๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

select for update ๊ตฌ๋ฌธ์˜ ํŠธ๋žœ์žญ์…˜์ด ์œ ์ง€๋˜๋Š” ๋™์•ˆ ํŠน์ • ๋กœ์šฐ์˜ ๋ฝ์„ ํš๋“ํ•˜๋ฉด,

ํ•ด๋‹น ๋กœ์šฐ์˜ ์กฐํšŒ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ˆ˜์ •์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.