2024. 9. 6. 11:11ใ๐กDatabase
SELECT ~ FOR UPDATE ๋
์ผ๋ฐ์ ์ธ SELECT ๊ตฌ๋ฌธ์ ๋ฝ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ฝ์ ํ๋ํ์ง ์์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ฃ .
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 ๊ตฌ๋ฌธ์ ํธ๋์ญ์ ์ด ์ ์ง๋๋ ๋์ ํน์ ๋ก์ฐ์ ๋ฝ์ ํ๋ํ๋ฉด,
ํด๋น ๋ก์ฐ์ ์กฐํ๋ ๊ฐ๋ฅํ์ง๋ง, ์์ ์ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.