πŸ’‘Database

[DB] Select For Update λž€? (feat. μ‘°νšŒμ™€ μ—…λ°μ΄νŠΈ)

Hugehoo 2024. 9. 6. 11:11

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 ꡬ문의 νŠΈλžœμž­μ…˜μ΄ μœ μ§€λ˜λŠ” λ™μ•ˆ νŠΉμ • 둜우의 락을 νšλ“ν•˜λ©΄,

ν•΄λ‹Ή 둜우의 μ‘°νšŒλŠ” κ°€λŠ₯ν•˜μ§€λ§Œ, μˆ˜μ •μ€ λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.