[DB] Select For Update λ? (feat. μ‘°νμ μ λ°μ΄νΈ)
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 ꡬ문μ νΈλμμ μ΄ μ μ§λλ λμ νΉμ λ‘μ°μ λ½μ νλνλ©΄,
ν΄λΉ λ‘μ°μ μ‘°νλ κ°λ₯νμ§λ§, μμ μ λΆκ°λ₯νλ€λ κ²μ μ μ μμ΅λλ€.