+) 22. 09. 03. μ 리 μΆκ°!
μΉμ 3. νΈλμμ μ΄ν΄ μκ° μλ£!!
λ°μ΄ν°λ₯Ό μ μ₯ν λ λ°μ΄ν°λ² μ΄μ€μ μ μ₯νλ μ΄μ λ 무μμΌκΉ?
μ¬λ¬ κ°μ§ μ΄μ κ° μμ§λ§, λ°μ΄ν°λ² μ΄μ€λ νΈλμμ
μ΄λ κ°λ
μ μ§μνκΈ° λλ¬Έμ΄λ€.
λ°μ΄ν°λ² μ΄μ€μμ νΈλμμ
μ νλμ κ±°λλ₯Ό μμ νκ² μ²λ¦¬νλλ‘ λ³΄μ₯ν΄ μ£Όλ κ²μ λ»νλ€.
μ: Aμ 5000μμ Bμκ² κ³μ’ μ΄μ²΄ν κ²½μ°
- Aμ μκ³ λ₯Ό 5000μ κ°μ
- Bμ μκ³ λ₯Ό 5000μ μ¦κ°
κ³μ’ μ΄μ²΄ κ±°λλ μμ κ°μ΄ λ κ°μ§ μμ
μ΄ ν©μ³μ Έμ νλμ μμ
μ²λΌ λμν΄μΌ νλ€.
λ°μ΄ν°λ² μ΄μ€κ° μ 곡νλ νΈλμμ
κΈ°λ₯μ μ¬μ©νλ©΄ 1, 2 λ λ€ ν¨κ» μ±κ³΅ν΄μΌ νλ€. λ§μ½ μ€κ°μ νλλΌλ μ€ν¨νλ€λ©΄ κ±°λ μ μ μνλ‘ λμκ° μ μλ€.
λͺ¨λ μμ
μ΄ μ±κ³΅ν΄μ λ°μ΄ν°λ² μ΄μ€μ μ μ λ°μνλ κ²μ 컀λ°(commit)μ΄λΌ νκ³ , μμ
μ€ νλλΌλ μ€ν¨ν΄μ κ±°λ μ΄μ μΌλ‘ λλ리λ κ²μ λ‘€λ°±(rollback)μ΄λΌ νλ€.
μ¬μ©μλ WASλ DB μ κ·Ό ν΄ κ°μ ν΄λΌμ΄μΈνΈλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€ μλ²μ μ κ·Όν μ μλ€. ν΄λΌμ΄μΈνΈλ λ°μ΄ν°λ² μ΄μ€ μλ²μ μ°κ²°μ μμ²νκ³ μ»€λ₯μ
μ λ§Ίκ² λλ€.
μ΄ λ λ°μ΄ν°λ² μ΄μ€ μλ²λ λ΄λΆμ μΈμ
μ λ§λ λ€. ν΄λΉ 컀λ₯μ
μ ν΅ν λͺ¨λ μμ²μ μ΄ μΈμ
μ ν΅ν΄μ μ€ννλ€.
μ¦, κ°λ°μκ° ν΄λΌμ΄μΈνΈλ₯Ό ν΅ν΄ SQLμ μ λ¬νλ©΄ νμ¬ μ»€λ₯μ
μ μ°κ²°λ μΈμ
μ΄ SQLμ μ€ννλ€. μΈμ
μ νΈλμμ
μ μμνκ³ , μ»€λ° λλ λ‘€λ°±μ ν΅ν΄ νΈλμμ
μ μ’
λ£νλ€.
λ°μ΄ν° λ³κ²½ 쿼리λ₯Ό μ€ννκ³ λ°μ΄ν°λ² μ΄μ€μ κ·Έ κ²°κ³Όλ₯Ό λ°μνλ €λ©΄ commitμ νΈμΆνκ³ , κ²°κ³Όλ₯Ό λ°μνκ³ μΆμ§ μμΌλ©΄ rollbackμ νΈμΆνλ©΄ λλ€.
컀λ°μ νΈμΆνκΈ° μ κΉμ§λ λ°μ΄ν°λ₯Ό μμλ‘ μ μ₯νλ κ²μ΄λ€. λ°λΌμ ν΄λΉ νΈλμμ
μ μμν μΈμ
(μ¬μ©μ)μκ²λ§ λ³κ²½ λ°μ΄ν°κ° 보μ΄κ³ λ€λ₯Έ μΈμ
(μ¬μ©μ)μκ²λ λ³κ²½ λ°μ΄ν°κ° 보μ΄μ§ μλλ€.
컀λ°νμ§ μμ λ°μ΄ν°λ₯Ό λ€λ₯Έ κ³³μμ μ‘°νν μ μλ€λ©΄?
컀λ°νμ§ μμ λ°μ΄ν°κ° 보μΈλ€λ©΄, μΈμ
2κ° λ°μ΄ν°λ₯Ό μ‘°ννμ λ μΈμ
1μ΄ μΆκ°(λ³κ²½)ν λ°μ΄ν°κ° λ³΄μΌ κ²μ΄λ€. μΈμ
2λ κ·Έ λ°μ΄ν°λ₯Ό κ°μ§κ³ μ΄λ ν λ‘μ§μ μνν μ μλ€. κ·Έλ°λ° μΈμ
1μ΄ λ‘€λ°±μ μννλ©΄ ν΄λΉ λ°μ΄ν°λ μ¬λΌμ§κ² λλ€. μ¦, λ°μ΄ν° μ ν©μ±μ ν° λ¬Έμ κ° λ°μνλ€. λ°λΌμ μ»€λ° μ μ λ°μ΄ν°λ λ€λ₯Έ μΈμ
μμ 보μ΄μ§ μλλ€.
μλ 컀λ°
μλ 컀λ°μΌλ‘ μ€μ νλ©΄ κ° μΏΌλ¦¬ μ€ν μ§ν μλμΌλ‘ 컀λ°μ νΈμΆνλ€. 컀λ°μ΄λ λ‘€λ°±μ μ§μ νΈμΆνμ§ μμλ λλ νΈλ¦¬ν¨μ΄ μλ€. νμ§λ§ 쿼리λ₯Ό μ€νν λλ§λ€ μλμΌλ‘ 컀λ°μ΄ λμ΄λ²λ¦¬κΈ° λλ¬Έμ μ°λ¦¬κ° μνλ νΈλμμ
κΈ°λ₯μ μ λλ‘ μ¬μ©ν μ μλ€.
μλ μ»€λ° μ€μ
set autocommit true; //μλ μ»€λ° λͺ¨λ μ€μ
insert into member(member_id, money) values ('data1', 10000); // μλ 컀λ°
insert into member(member_id, money) values ('data2', 10000); // μλ 컀λ°
μλ μ»€λ° μ€μ
set autocommit false; //μλ μ»€λ° λͺ¨λ μ€μ
insert into member(member_id, money) values ('data3', 10000);
insert into member(member_id, money) values ('data4', 10000);
commit; //μλ 컀λ°
λ³΄ν΅ μλ μ»€λ° λͺ¨λκ° κΈ°λ³ΈμΌλ‘ μ€μ λ κ²½μ°κ° λ§κΈ° λλ¬Έμ, μλ μ»€λ° λͺ¨λλ‘ μ€μ νλ κ²μ νΈλμμ
μ μμνλ€κ³ ννν μ μλ€.
μλ μ»€λ° λͺ¨λλ μλ μ»€λ° λͺ¨λλ ν λ² μ€μ νλ©΄ ν΄λΉ μΈμ
μμλ κ³μ μ μ§λλ€.
μ κ· λ°μ΄ν° μΆκ° - μ»€λ° μ
μμ§ μΈμ 1μ΄ μ»€λ°μ νμ§ μμ μνκΈ° λλ¬Έμ μΈμ 1μμλ μ λ ₯ν λ°μ΄ν°κ° 보μ΄μ§λ§, μΈμ 2μμλ μ λ ₯ν λ°μ΄ν°κ° 보μ΄μ§ μλ κ²μ νμΈν μ μλ€.
μΈμ 1 μ κ· λ°μ΄ν° μΆκ° ν commit
μΈμ 1μ΄ νΈλμμ μ 컀λ°νκΈ° λλ¬Έμ λ°μ΄ν°λ² μ΄μ€μ μ€μ λ°μ΄ν°κ° λ°μλλ€. μ»€λ° μ΄νμλ λͺ¨λ μΈμ μμ λ°μ΄ν°λ₯Ό μ‘°νν μ μλ€.
μΈμ 1μ΄ νΈλμμ μ μμνκ³ λ°μ΄ν°λ₯Ό μμ νλ λμ μμ§ μ»€λ°μ μννμ§ μμλλ°, μΈμ 2μμ λμμ κ°μ λ°μ΄ν°λ₯Ό μμ νκ² λλ©΄ μ¬λ¬ λ¬Έμ κ° λ°μνλ€. νΈλμμ μ μμμ±μ΄ κΉ¨μ§λ κ²μ΄λ€.
μ΄λ° λ¬Έμ λ₯Ό λ°©μ§νλ €λ©΄ μΈμ μ΄ νΈλμμ μ μμνκ³ λ°μ΄ν°λ₯Ό μμ νλ λμμλ 컀λ°μ΄λ λ‘€λ°± μ κΉμ§ λ€λ₯Έ μΈμ μμ ν΄λΉ λ°μ΄ν°λ₯Ό μμ ν μ μλλ‘ ν΄μΌ νλ€.
λ°μ΄ν°λ² μ΄μ€λ μ΄λ° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ½(Lock)μ΄λΌλ κ°λ μ μ 곡νλ€.
μΌλ°μ μΈ μ‘°νλ λ½μ μ¬μ©νμ§ μλλ€.
λ³΄ν΅ λ°μ΄ν°λ₯Ό μ‘°νν λλ λ½μ νλνμ§ μκ³ λ°λ‘ λ°μ΄ν°λ₯Ό μ‘°νν μ μλ€. μλ₯Ό λ€μ΄, μΈμ
1μ΄ λ½μ νλνκ³ λ°μ΄ν°λ₯Ό λ³κ²½νκ³ μμ΄λ μΈμ
2μμ λ°μ΄ν°λ₯Ό μ‘°νν μ μλ€.
μ‘°νμ λ½
λ°μ΄ν°λ₯Ό μ‘°νν λλ λ½μ μ»κ³ μΆλ€λ©΄ select for update
ꡬ문μ μ¬μ©νλ©΄ λλ€.
μ‘°ν μμ μ λ½μ΄ νμν κ²½μ°λ?
νΈλμμ
μ’
λ£ μμ κΉμ§ ν΄λΉ λ°μ΄ν°λ₯Ό λ€λ₯Έ κ³³μμ λ³κ²½νμ§ λͺ»νλλ‘ κ°μ λ‘ λ§μμΌ ν λ μ¬μ©νλ€.