DB Lock
Concurrency
μ¬λ¬ μμ
μ΄ λμμ μ€νλλ κ²μ²λΌ 보μ΄λλ‘ κ΄λ¦¬λλ μν
νλμ CPUμμ μ¬λ¬ μμ
μ΄ μ€νλ λ, CPUλ λΉ λ₯΄κ² μμ
μ μ ννμ¬ λ§μΉ μ¬λ¬ μμ
μ΄ λμμ μ€νλλ κ²μ²λΌ 보μ΄κ² νλ€.
λμμ±μ νμ©νλ©΄ νλ‘κ·Έλ¨μ μ¬λ¬ λΆλΆμ΄ λμμ μ€νλμ΄, λ λ§μ μμ μ λΉ λ₯΄κ² μ²λ¦¬ν μ μκ³ , μμμ ν¨μ¨μ μΌλ‘ μ¬μ©νλ©°, μλ΅μ ν₯μμν¬ μ μλ€.
νΉν λ°μ΄ν°λ² μ΄μ€λ λ€μμ μ¬μ©μκ° λμμ μ κ·Όνλ€. μ΄ κ³Όμ μμ μ¬μ©μμ λν μ μ΄κ° μ μ νκ² μ΄λ£¨μ΄μ§μ§ μμΌλ©΄ λ°μ΄ν°μ μΌκ΄μ±κ³Ό 무결μ±μ΄ κΉ¨μ§κ² λλ€. λ°λΌμ λμμ± μ μ΄λ₯Ό ν΅ν΄ μ¬λ¬ μ¬μ©μκ° λμμ μ¬λ¬ κ°μ νΈλμμ μ μν λ, λ°μ΄ν°μ μΌκ΄μ±μ΄ κΉ¨μ§μ§ μλλ‘ ν΄μΌνλ€.
λ½μ λ²μ
DB, νμΌ, ν μ΄λΈ, νμ΄μ§, μ»¬λΌ λ±
λκ΄μ λ½ (Optimistic Lock)
μμμ λ½μ κ±Έμ§ μκ³ , λμμ± λ¬Έμ κ° λ°μνλ©΄ κ·Έλ κ·Έλ μ²λ¦¬νλ λ°©μ
μμ μμ μ ν λ μμ νλ€κ³ λͺ μνμ¬ λ€λ₯Έ νΈλμμ μ΄ λμΌν 쑰건μΌλ‘ κ°μ μμ ν μ μλλ‘ νλ€.
versionκ³Ό κ°μ λ³λμ 컬λΌμ μΆκ°νμ¬ μΆ©λμ λ°μμ λ§λλ€. version(hashcode/ timestamp)μ μνλ‘ μΆ©λμ νμΈνλ©°, μΆ©λλ κ²½μ° λ‘€λ°±νλ€.
λ°μ΄ν° μΆ©λμ΄ μμ£Ό μΌμ΄λμ§ μμ κ²μ΄λΌκ³ μμλλ κ²½μ° μ£Όλ‘ μ¬μ©νλ€.
μ‘°ν μμ
μ΄ λ§κΈ° λλ¬Έμ λμ μ κ·Ό μ±λ₯μ΄ μ€μνλ€.
μ₯λ¨μ
μΆ©λμ΄ μλλ€λ κ°μ νμ, λμ μμ²μ λν μ²λ¦¬ μ±λ₯μ΄ μ’λ€.
κ·Έλ¬λ μΆ©λμ΄ λΉλ²νκ² μΌμ΄λλ κ²½μ°, λ‘€λ°±μ²λ¦¬μ λν λΉμ©μ΄ λ§μ΄ λ€μ΄ μ±λ₯μ΄ λ¨μ΄μ§ μ μλ€.
λν, κ°λ°μκ° μ§μ λ‘€λ°±μ ꡬνν΄μΌνκΈ° λλ¬Έμ μμ€ν
ꡬ쑰μ λ°λΌ 볡μ‘ν΄μ§ μ μλ€.
λΉκ΄μ λ½ (Pessimistic Lock)
곡μ μμμ μ κ·Όν λ, λ°μ΄ν° μΆ©λμ΄ λ°μν κ°λ₯μ±μ 미리 κ³ λ €νκ³ μ΄λ₯Ό λ°©μ§νκΈ° μν΄
μμμ λν΄ λ½μ 미리 κ±°λ λ°©λ²
νλμ νΈλμμ μ΄ μμμ μ κ·Όμ λ½μ κ±Έκ³ , λ€λ₯Έ νΈλμμ μ΄ μ κ·Όνμ§ λͺ»νκ² νμ¬ μ‘°ν λλ κ°±μ μ²λ¦¬κ° μλ£λ λκΉμ§ λ½μ μ μ§νλ€.
- Shared Lock(곡μ , μ½κΈ° μ κΈ)
- Exclusive Lock(λ°°ν, μ°κΈ° μ κΈ)
μΆ©λμ΄ μμ£Ό λ°μνλ μν©μ μ 리νλ©° λ°μ΄ν°μ 무결μ±μ 보μ₯νλ€. νμ§λ§ μ‘°ν μμ μ΄ λ§μ κ²½μ° μ±λ₯μ΄ λ¨μ΄μ§κ³ , μλ‘ μμμ΄ νμν κ²½μ° λ°λλ½μ 걸릴 κ°λ₯μ±μ΄ μλ€.
λ°λΌμ, 쑰건μ μΆκ°νμ¬ λκΈ°μκ°μ μ£Όκ±°λ μμΈ μ²λ¦¬λ₯Ό ν μ μλ€.
NO WIAT
μ κΈμ νλνμ§ λͺ»νλ©΄ λ°λ‘ μμΈλ₯Ό λ°μμν¨λ€.
νΈλμμ μ λ€λ₯Έ νΈλμμ μ μ κΈμ΄ ν΄μ λ λκΉμ§ λκΈ°νμ§ μκ³ , λ°λ‘ μ€ν¨νλ€.
μ¦κ° μ μΈ μ€ν¨ μλ΅μ΄ νμν κ²½μ° μ¬μ©WAIT[n]
νΈλμμ μ΄ μ κΈμ μμ²νμ λ, ν΄λΉ μμμ΄ μ 겨μλ κ²½μ°, μ΅λ n μ΄ λμ λκΈ°νλ€.
n μ΄ λμ μ κΈμ΄ ν΄μ λμ§ μμΌλ©΄ μμΈκ° λ°μνλ©° νΈλμμ μ΄ μ€ν¨νλ€.
νΈλμμ μ΄ μμλ λ Shared Lock λλ Exclusive Lockμ κ±Έκ³ μμνλ€.
곡μ λ½ (Shared Lock, Read Lock)
νΉμ μμμ λν΄ μ¬λ¬ νΈλμμ
μ΄ λμμ μ½κΈ° μμ
μ μνν μ μλλ‘ νμ©νλ λ½
μ¬λ¬ νΈλμμ μ΄ λμμ μ κ·Όνμ¬ λ°μ΄ν°λ₯Ό μ½μ μ μμ§λ§, μ°κΈ° μμ μ μ νλλ€. μ£Όλ‘ λ°μ΄ν° μ½κΈ°μ λμμ±μ λμ΄κΈ° μν΄ μ¬μ©νλ©°, μ΄λ€ μμμ 곡μ λ½μ΄ λμμ μ¬λ¬ κ° μ μ©λ μ μλ€.
μΌλ°μ μΌλ‘ select ν λ 곡μ λ½μ΄ λ°μνλ©°, μ΄λ€ μμμ΄ κ³΅μ λ½μ κ±Έλ €μλ κ²½μ° λ² νμ λ½μ κ±Έ μ μλ€.
곡μ λ½μ νΉμ§
- λμ μ½κΈ° νμ©
곡μ λ½μ΄ μ€μ λ μμμ μ¬λ¬ νΈλμμ μ΄ λμμ μ½μ μ μλ€. λ°μ΄ν°λ₯Ό μ½λ μμ μ΄ λ³λ ¬λ‘ μνλκΈ° λλ¬Έμ μ±λ₯μ΄ ν₯μλλ€. - μ°κΈ° μ ν
곡μ λ½μ΄ μ€μ λ μμμ λν΄ λ€λ₯Έ νΈλμμ μ΄ μ°κΈ° μμ μ μννλ €κ³ νλ©΄ κ·Έ νΈλμμ μ 곡μ λ½μ΄ ν΄μ λ λκΉμ§ λκΈ°ν΄μΌ νλ€. λ°μ΄ν°λ₯Ό μΌκ΄λκ² μ μ§νκ³ , μ½κΈ° μ€μΈ λ°μ΄ν°κ° λ³κ²½λμ§ μλλ‘ λ³΄μ₯νλ€. - λ½ μΆ©λ
λ§μ½ ν νΈλμμ μ΄ κ³΅μ λ½μ κ±Έκ³ λ°μ΄ν°λ₯Ό μ½κ³ μμ λ, λ€λ₯Έ νΈλμμ μ΄ ν΄λΉ μμμ λ°°νλ½μ κ±Έλ €κ³ μλνλ©΄ μΆ©λμ΄ λ°μνλ€. μ΄ κ²½μ° μ°κΈ° μμ μ 곡μ λ½μ΄ ν΄μ λ λκΉμ§ λκΈ°νλ€. - λ°μ΄ν° μΌκ΄μ± μ μ§
곡μ λ½μ νΈλμμ μ΄ λ°μ΄ν°λ₯Ό μ½λ λμ ν΄λΉ λ°μ΄ν°κ° λ€λ₯Έ νΈλμμ μ μν΄ λ³κ²½λμ§ μλλ‘ λ³΄νΈνλ€.
곡μ λ½μ μ₯λ¨μ
μ¬λ¬ νΈλμμ μ΄ λμμ λ°μ΄ν°λ₯Ό μ½μ μ μμ΄ μ½κΈ° μμ μ ν¨μ¨μ±μ΄ λμΌλ©°, λ°μ΄ν°λ₯Ό μ½λ λμ λ°μ΄ν°μ μΌκ΄μ±μ μ μ§ν μ μλ€. κ·Έλ¬λ μ¬λ¬ νΈλμμ μ΄ κ³΅μ λ½μ μ€μ ν μνμ£μλ μ°κΈ° μμ μ κΈ°λ€λ €μΌ νκΈ° λλ¬Έμ μ±λ₯μ νκ° λ°μν μ μλ€. λν λ°λλ½μ΄ λ°μν μ μλ€.
λ°°ν λ½ (Exclusive Lock, Write Lock)
νΉμ μμ(λ°μ΄ν°, ν, ν
μ΄λΈ λ±)μ λν΄ νλμ νΈλμμ
μ΄ λ
μ μ μΌλ‘ μ κ·Όν μ μλλ‘ μ€μ νλ λ½
λ°°νλ½μ΄ κ±Έλ¦° μμμλ λ€λ₯Έ νΈλμμ μ΄ μ½κΈ°, μ°κΈ° μμ μ μνν μ μλ€.
1
SELECT * FROM Member WHERE id = 1 FOR UPDATE;
λ°°νλ½μ μ€μ νκΈ° μν΄ μ¬μ©νλ ꡬ문μ΄λ©°, ν΄λΉ λ°μ΄ν°μ μ°κΈ°λ½μ κ±Έμ΄, λ€λ₯Έ νΈλμμ μ΄ λμμ κ·Έ λ°μ΄ν°μ μ κ·Ό, μμ νμ§ λͺ»νλλ‘ νλ€.
λ°°νλ½μ νΉμ§
- λ
μ μ μ κ·Ό
μμμ μ κ·Ό νΈλμμ μ΄ μμμ λ μ μ μΌλ‘ μ κ·Έν μ μλ€. λ€λ₯Έ νΈλμμ μ ν΄λΉ μμμ΄ μ 겨μλ λμ μ κ·Όν μ μλ€. - μ°κΈ° μμ
보νΈ
μΌλ°μ μΌλ‘ μ°κΈ°(μμ , μμ , μ½μ λ±) μμ μ μννκΈ° μ μ μ€μ λλ€. λ°λΌμ λ€λ₯Έ νΈλμμ μ΄ ν΄λΉ μμμ λμμ μμ νμ§ λͺ»νλλ‘ νμ¬ μΆ©λμ λ°©μ§νλ€. - λμμ± μ μ΄
λ°μ΄ν°λ₯Ό 보νΈνκ³ μ¬λ¬ νΈλμμ μ΄ λμμ λ°μ΄ν°λ₯Ό μ²λ¦¬ν λ λ°μν μ μλ λ¬Έμ λ₯Ό μλ°©νλ€. - λ½ λκΈ°
λ€λ₯Έ νΈλμμ μ΄ λ°°νλ½μ΄ κ±Έλ¦° μμμ μ κ·Όνλ €κ³ νλ©΄, ν΄λΉ νΈλμμ μ λ½μ΄ ν΄μ λ λκΉμ§ λκΈ°ν΄μΌ νλ€.
μλ₯Ό λ€μ΄, μν μμ€ν μμ νΉμ κ³μ’μ μμ‘μ μμ νλ νΈλμμ μ΄ μλ€.
νΈλμμ Aκ° κ³μ’μ μμ‘μ μμ νλ €κ³ ν λ, λ¨Όμ ν΄λΉ κ³μ’ λ°μ΄ν°μ λ°°νλ½μ μ€μ νλ€. μ΄λ, νΈλμμ Aκ° μμ μ μλ£νκ³ λ½μ ν΄μ ν λκΉμ§, νΈλμμ Bλ κ·Έ κ³μ’μ μ κ·Όν μ μκ²λλ€. νΈλμμ Aκ° μμ μ μλ£ν ν λ½μ ν΄μ νλ©΄, νΈλμμ Bκ° κ³μ’μ μ κ·Όν μ μλ€.
λ°μ΄ν°μ 무결μ±κ³Ό μΌκ΄μ±μ 보μ₯νλ©° μΆ©λμ 미리 λ°©μ§νμ¬ λ°μ΄ν°μ μμκ³Ό λΉ μΌκ΄μ±μ λ°©μ§νλ€.
κ·Έλ¬λ μμμ΄ λ½μ΄ κ±Έλ¦° λμ λ€λ₯Έ νΈλμμ μ΄ λκΈ°ν΄μΌ νλ―λ‘ μ±λ₯ μ νκ° λ°μν μ μμΌλ©°, λκΈ° μκ°μ΄ κΈΈμ΄μ§ κ²½μ°, λ°λλ½μ κ°λ₯μ±μ΄ μ¦κ°νλ€.
λ°°νλ½μ μ₯λ¨μ
λ°μ΄ν°μ 무결μ±κ³Ό μΌκ΄μ±μ 보μ₯νλ©°, μΆ©λμ μ¬μ μ λ°©μ§νκΈ° λλ¬Έμ λ°μ΄ν°μ μμκ³Ό λΉμΌκ΄μ±μ λ°©μ§ν μ μλ€.
κ·Έλ¬λ μμμ΄ λ½μ κ±Έλ¦° λμ λ€λ₯Έ νΈλμμ μ΄ λκΈ°ν΄μΌνκΈ° λλ¬Έμ μ±λ₯ μ νκ° λ°μν μ μμΌλ©°, λκΈ° μκ°μ΄ κΈΈμ΄μ§ κ²½μ° λ°λλ½μ κ°λ₯μ±μ΄ μ¦κ°νλ€.