π μ΄μ κΈ: [Jdbc] 컀λ₯μ νλ§κ³Ό DataSource μΈν°νμ΄μ€
β νΈλμμ κ°λ
λ°μ΄ν°λ² μ΄μ€λ νΈλμμ μ μ§μνλ€.
νμΌ μμ€ν λμ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νλ κ°μ₯ ν° μ΄μ μ€ νλμ΄κΈ°λ νλ€.
νΈλμμ μ΄λ, νλμ μμ μ μμ νκ² μ²λ¦¬νλλ‘ λ³΄μ₯ν΄μ£Όλ κ²μ΄λ€.
νΈλμμ μμ λͺ¨λ μμ μ΄ μ±κ³΅ν΄μ DBμ μ μ λ°μλλ κ²μ Commitμ΄λΌκ³ νλ€.
νΈλμμ μμ μμ μ€ νλλΌλ μ€ν¨ν΄μ νΈλμμ μμ μ μνλ‘ λλ리λ κ²μ Rollbackμ΄λΌκ³ νλ€.
π νΈλμμ ACID
- νΈλμμ μ μμμ±(Atomicity), μΌκ΄μ±(Consistency), 격리μ±(Isolation), μ§μμ±(Durability)μ λͺ¨λ 보μ₯ν΄μΌ νλ€.
π₯ μμμ± (Atomicity)
- νΈλμμ μμμ μ€νν μμ λ€μ λ§μΉ νλμ μμ μΈ κ²μ²λΌ λͺ¨λ μ±κ³΅νκ±°λ, λͺ¨λ μ€ν¨ν΄μΌ νλ€.
π₯ μΌκ΄μ± (Consistency)
- λͺ¨λ νΈλμμ μ μΌκ΄μ± μλ λ°μ΄ν°λ² μ΄μ€ μνλ₯Ό μ μ§ν΄μΌ νλ€.
- μλ₯Ό λ€μ΄ λ°μ΄ν°λ² μ΄μ€μμ μ ν λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ νμ λ§μ‘±ν΄μΌ νλ€.
π₯ κ²©λ¦¬μ± (Ioslation)
- λμμ μ€νλλ μλ‘ λ€λ₯Έ νΈλμμ λ€μ΄ μλ‘μκ² μν₯μ λ―ΈμΉμ§ μλλ‘ κ²©λ¦¬ν΄μΌ νλ€.
- 격리μ±μ λμμ±κ³Ό κ΄λ ¨λ μ±λ₯ μ΄μ(νΈλμμ κ° κ²©λ¦¬μ±μ μλ²½ν 보μ₯νλ €κ³ νλ©΄ λμ μ²λ¦¬ μ±λ₯μ΄ λλΉ μ§)λ₯Ό λ°μμν€κΈ° λλ¬Έμ,
νΈλμμ 격리 μμ€μ μ ννμ¬ μ€μ ν μ μλ€.
π νΈλμμ 격리 μμ€ (Isolation level)
- READ UNCOMMITED (컀λ°λμ§ μμ μ½κΈ°)
- READ COMMITED (컀λ°λ μ½κΈ°)
- REPEATABLE READ (λ°λ³΅ κ°λ₯ν μ½κΈ°)
- SERIALIZABLE (μ§λ ¬ν κ°λ₯)
π₯ μ§μμ± (Durability)
- νΈλμμ λμ€ μ₯μ κ° λ°μνλλΌλ κ·Έ κ²°κ³Όκ° νμ μ§μλμ΄μΌ νλ€.
- νΈλμμ λμ€ μμ€ν μ λ¬Έμ κ° μκΈ°λλΌλ λ°μ΄ν°λ² μ΄μ€ λ‘κ·Έ λ±μ νμΈν΄μ νΈλμμ μ±κ³΅ λ΄μ©μ 볡ꡬν΄μΌ νλ€.
(λΆλΆμ μΌλ‘ μνλμλ€λ©΄ λ‘€λ°±)
- μ½κ² λ§νλ©΄, μ μμ μΌλ‘ μλ£λμκ±°λ λΆλΆμλ£λ λ°μ΄ν°λ DBMSκ° μ± μμ§κ³ λ°μ΄ν°λ² μ΄μ€μ κΈ°λ‘ν΄μΌ νλ€.
β νΈλμμ μ€μ΅ (λμΌλ‘ νμΈ)
λ°μ΄ν°λ² μ΄μ€λ νλμ 컀λ₯μ λΉ νλμ DBμΈμ μ΄ μκΈ΄λ€.
νΈλμμ λμ€ λ³κ²½λ λ°μ΄ν°λ DBμΈμ μ μμμ μ₯λκ³ , νΈλμμ μ΄ λλλ©΄ μ»€λ° λλ λ‘€λ°±λλ€.
컀λ°λκΈ° μ DB μΈμ μ μμ μ μ₯λ λ°μ΄ν°λ λ€λ₯Έ DBμΈμ μμλ νμΈν μ μλ€.
λμΌλ‘ νμΈν΄λ³΄κΈ° μν΄μ λ‘컬 h2 databaseλ₯Ό μ€νμν€κ³ ,
λ κ°μ db ν΄λΌμ΄μΈνΈλ‘ μ μν΄λ³΄μλ€. (JSESSIONIDκ° μλ‘ λ€λ₯΄λ€)
μΌμͺ½μ μΈμ 1, μ€λ₯Έμͺ½μ μΈμ 2λΌκ³ νκ² λ€.
ν μ΄λΈμ 미리 μμ±ν΄λμλ€.
π μλ μ»€λ° λͺ¨λ μ€μ νκΈ°
κΈ°λ³Έμ μΌλ‘λ μλ μ»€λ° λͺ¨λλ‘ μ€μ λμ΄ μκΈ° λλ¬Έμ
쿼리 νλλ₯Ό μ€ννλ©΄ μλμΌλ‘ commit; λͺ λ Ήμ΄λ ν¨κ» μ€νλλ€.
λ°λΌμ νλμ νΈλμμ μμ μ¬λ¬ κ°μ 쿼리λ₯Ό μ²λ¦¬νλ €λ©΄ μλ μ»€λ° λͺ¨λλ‘ μ€μ ν΄μΌνλ€.
set autocommit true; // μλ μ»€λ° λͺ¨λ μ€μ
set autocommit false; // μλ μ»€λ° λͺ¨λ μ€μ
π μ»€λ° μ μμ λ°μ΄ν°λ λ€λ₯Έ μΈμ μμ νμΈν μ μλ€!
μΈμ 1μμ insertλ¬Έμ μ€νν λ€, μΈμ 1μμ selectν΄λ³΄λ©΄ μλ‘ μΆκ°ν λ©€λ²λ₯Ό νμΈν μ μλ€.
κ·Έλ¬λ μΈμ 2μμλ μΈμ 1μ μμμ μ₯λ λ°μ΄ν°λ₯Ό νμΈν μ μλ€.
π 컀λ°μ νλ©΄, λ€λ₯Έ DBμΈμ μμ 보μΈλ€!
μΈμ 1μμ 컀λ°μ νλλ, μΈμ 2μμλ ν΄λΉ λ°μ΄ν°λ₯Ό λ³Ό μ μλ€.
π μ΄λ²μλ μΈμ 2μμ λ©€λ² μ 보λ₯Ό μμ ν΄λ³΄μλ€.
(autocommit μ€μ μ DBμΈμ λ§λ€ λ°λ‘ μ€μ λλ κ² κ°λ€.
κ·Έλμ μΈμ 2μμλ autocommit μμ±μ falseλ‘ μ€μ ν΄μ£Όμ΄μΌ νλ κ²μ νμΈνλ€)
μΈμ 1μμλ μΈμ 2μ μμ μ μ₯λ λ°μ΄ν°λ₯Ό νμΈν μ μλ€.
π μΈμ 2μμ λ‘€λ°±μ νλ©΄, λ³κ²½μ¬νμ΄ μμ볡ꡬλλ€.
λΉμ°ν μΈμ 1μμλ μμ볡ꡬλ λ°μ΄ν°λ₯Ό μ½μ μ μλ€.
β λ°μ΄ν°λ² μ΄μ€ Lock
μΈμ 1μμ νΈλμμ μ μμνκ³ λ°μ΄ν°λ₯Ό μμ νλ λμ
μΈμ 2μμλ κ°μ λ°μ΄ν°λ₯Ό μμ νκ² λλ©΄,
νΈλμμ μ μμμ±μ΄ κΉ¨μ§λ λ¬Έμ κ° λ°μν κ²μ΄λ€.
λ°μ΄ν°λ² μ΄μ€λ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ Lock μ΄λΌλ κ°λ μ μ 곡νλ€.
νΉμ μΈμ μμ νΉμ λ°μ΄ν°(row)λ₯Ό μμ νκΈ° μν΄μλ λ½μ νλν΄μΌνλ€.
λμμ λ€λ₯Έ μΈμ μμ λμΌν λ°μ΄ν°λ₯Ό μμ νλ €κ³ νλ©΄ λ½μ νλνμ§ λͺ»ν΄ λκΈ°νκ² λλ€.
λ½μ κ°μ§κ³ μλ μΈμ μ΄ commit λλ rollbackμ νκ² λλ©΄ λ½μ λ°λ©νκ³ , λ€λ₯Έ μΈμ μ΄ λ½μ νλν μ μκ² λλ€.
π λμΌλ‘ νμΈν΄λ³΄κΈ°
μ°μ μ€μ΅μ μν΄ ν μ΄λΈμ 2κ°μ λ°μ΄ν°λ₯Ό μΆκ°νμλ€.
μΈμ 1μμ λ©€λ² asdfμ λμ 100μΌλ‘ λ³κ²½νμλ€. μ΄λ μΈμ 1μ pkκ° asdfμΈ λ°μ΄ν°μ λν΄ λ½μ νλνκ² λλ€.
λμμ μΈμ 2μμ λ©€λ² qwerκ³Ό λ©€λ² asdfμ λμ 0μΌλ‘ λ³κ²½νλ €κ³ μλνλ€.
μΈμ 2λ λ©€λ² qwerμ λν΄μλ λ½μ νλνμ¬ λ©€λ² qwer λ°μ΄ν°λ₯Ό μμ ν μ μλ€.
κ·Έλ¬λ λ©€λ² asdfμ κ²½μ° μΈμ 1μ΄ λ½μ κ°μ§κ³ μκΈ° λλ¬Έμ μΈμ 2μμ λ½ νλμ μ€ν¨νκ³ , λ½μ νλν λκΉμ§ λκΈ°νκ² λλ€.
λκ°μ κ²½μ° set lock_timeout 100; λͺ λ Ήμ΄λ₯Ό ν΅ν΄ lock νλμ μν΄ 100millisλ§νΌλ§ λκΈ°νκ³ , νμμμμ΄ λ°μνλ©΄ 쿼리 μ€νμ μ·¨μνλλ‘ μ€μ ν΄λμλ€.
π μΈμ 1μμ 컀λ°μ νλ©΄ λ½μ λ°λ©νλ€.
μΈμ 2μμ λ€μ λ©€λ² asdf λ°μ΄ν°λ₯Ό λ³κ²½μλνλ©΄,
λ½ νλμ μ±κ³΅νμ¬ λ³κ²½λ μ±κ³΅νκ² λλ€.
μ°Έκ³ λ‘, select for update ꡬ문μ μ¬μ©νλ©΄
νΉμ μΈμ μμ selectνλ λμμλ ν΄λΉ λ°μ΄ν°μ λν λ½μ νλνκ² λλ€.
λ°λΌμ λ½μ νλν μΈμ μ νΈλμμ μ΄ λλμ§ μμ λμμλ
λ€λ₯Έ μΈμ μμ ν΄λΉ λ°μ΄ν°λ₯Ό μμ ν μ μκ² λλ€.
π λ€μ κΈ :[jdbc] νΈλμμ κ΄λ¦¬ (feat. μ€νλ§ νλ μμν¬)
'κ°μΈ κ³΅λΆ > DB' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[jdbc] νΈλμμ κ΄λ¦¬ (feat. μ€νλ§ νλ μμν¬) (0) | 2025.02.05 |
---|---|
[Jdbc] 컀λ₯μ νλ§κ³Ό DataSource μΈν°νμ΄μ€ (1) | 2025.01.28 |
JDBCμ SQL Mapper, ORM κ°λ¨ν μ 리 (0) | 2025.01.21 |
λ°μ΄ν°λ² μ΄μ€ 보μκ³Ό PRIVILEGES (0) | 2024.11.24 |
μ€ν€λ§ μ μ λ₯Ό ν΄μΌ νλ μ΄μ (μ½μ μ΄μ, μμ μ΄μ, κ°±μ μ΄μ) (1) | 2024.11.11 |