1. νΈλμμ μ΄λ ?
νΈλμμ μ νλ§λλ‘ μ€λͺ νμλ©΄ "λͺ¨λ λͺ λ Ήμ΄μ μ±κ³΅ λλ μ€ν¨λ₯Ό νκΊΌλ²μ λͺ¨μμ μ²λ¦¬νλ κ²" νκ³ ν μ μμ΅λλ€.
λ§μΌ, μ¬λ¬ λͺ λ Ήμ΄λ₯Ό ν λ²μ μ²λ¦¬νλ€κ° κ·Έ μ€ νλλΌλ μ€ν¨νλ©΄, νΈλμμ λ΄μ λͺ¨λ λͺ λ Ήμ΄κ° 무ν¨ν(λ‘€λ°±)λ©λλ€.
π° μλ₯Ό λ€μ΄, μνμμ λ€λ₯Έ κ³μ’λ‘ λμ μ‘κΈνλ μν©μ κ°μ ν΄ λ³΄κ² μ΅λλ€.
1. λ΄ κ³μ’μμ λμ μΆκΈνκ³
2. λ€λ₯Έ κ³μ’λ‘ λμ μ κΈνλ©΄ μ‘κΈμ΄ μ±κ³΅ν©λλ€ !
νμ§λ§, λ§μ½ λλ²μ§Έ κ³Όμ μμ μ€λ₯κ° λ°μν΄ μ κΈμ΄ λμ§ μμΌλ©΄, λμ΄ μ΄λκ°λ‘ μ¬λΌμ§κ² λ©λλ€ π€
μ΄λ° μν©μ λ°©μ§νκΈ° μν΄μλ, 1λ²κ³Ό 2λ² κ³Όμ μ νλμ νΈλμμ μΌλ‘ λ¬Άμ΄μΌ ν©λλ€
μ΄λ κ² νλ©΄ λ μ€ νλλΌλ μ€ν¨νλ©΄ μ 체 νΈλμμ μ΄ λ‘€λ°±λμ΄, μ€λ₯λ₯Ό λ°©μ§ν μ μμ΅λλ€. !
2. νΈλμμ μ μ±μ§
νΈλμμ μ ACID λΌκ³ λΆλ¦¬λ μ΄ 4κ°μ§μ μ±μ§μ κ°μ§κ³ μμ΅λλ€.
μ±μ§ | μ€λͺ | μμ |
A tomicity (μμμ±) | νΈλμμ μ λΆλΆμ μΌλ‘ μλ£λ μ μμΌλ©°, μ μ²΄κ° μλ£λκ±°λ μμ μ€νλμ§ μμμΌ νλ€. | μΆκΈλ§ μ±κ³΅νκ³ μ κΈμ΄ μ€ν¨νλ©΄ μ λλ€. |
C onsistency (μΌκ΄μ±) | νΈλμμ μ΄ μ±κ³΅μ μΌλ‘ μλ£λλ©΄ νμ μΌκ΄μ± μλ λ°μ΄ν°λ² μ΄μ€ μνλ‘ μ μ§λμ΄μΌ νλ€. | κ³μ’ μ΄μ²΄ μ κ³Ό νμ λμ ν©μ΄ κ°μμΌ νλ€. |
I solation (λ 립μ±,격리μ±) | νΈλμμ μν μ€ λ€λ₯Έ νΈλμμ μ μμ μ΄ λΌμ΄λ€μ§ μλλ‘ λ³΄μ₯λλ€. | μΆκΈ ν, λ€λ₯Έ νΈλμμ μ΄ λ΄ κ³μ’μ κΈμ‘μ μμ νμ§ λͺ»νλλ‘ ν΄μΌ νλ€. |
D urablility (μμμ±,μ§μμ±) | μ±κ³΅μ μΌλ‘ μνλ νΈλμμ μ μμ€ν μ₯μ κ° λ°μνλλΌλ μꡬμ μΌλ‘ λ°μλλ€. | μμ€ν μ λ¬Έμ κ° μκΈ°λλΌλ, 컀λ°λ λ°μ΄ν°λ DBμ μꡬμ μΌλ‘ λ°μλμ΄μΌ νλ€. |
νμ§λ§ ACID μμΉμ μλ²½νκ² μ§ν€λ©΄ λμμ±μ΄ λ¨μ΄μ§κ² λ©λλ€ β¬οΈ
κ·Έλ κΈ° λλ¬Έμ ACID μμΉμ ν¬μνμ¬ λμμ±μ μ»μ μ μλ λ°©λ²μΈ 격리 μμ€ (isolation level) μ μ‘°μ ν μ μλ λ°©λ²μ μ 곡ν©λλ€
3. νΈλμμ 격리 μμ€ (isolation level)
격리 μμ€μ 3κ°μ§ λ¬Έμ κ° λ°μνλμ§μ λ°λΌμ λΆλ₯ν©λλ€.
1. Dirty Read
2. Non-Repeatable Read
3. Phantom Read
3-1. Dirty Read (λΉμ»€λ° μ½κΈ°)
νΈλμμ μμ 컀λ°λκΈ° μ μμ λ΄μ©μ λ€λ₯Έ νΈλμμ μμ λ³Ό μ μλ νμμ Dirty Read λΌκ³ ν©λλ€.
μλ₯Ό λ€μ΄μ
- νΈλμμ A μμ id: 22, name: μ΄λ¦μΈ row λ₯Ό insert νκ³ μ»€λ°νμ§ μμ μνμμ,
- νΈλμμ B κ° id: 22 λ₯Ό select νλ©΄, B λ A μ λ°μ΄ν°λ₯Ό μ½μ μ μμ΅λλ€.
- μ΄λ A νΈλμμ μ΄ μ»€λ°λμ§ μκ³ λ‘€λ°±λλ©΄, νΈλμμ B λ μλͺ»λ λ°μ΄ν°λ₯Ό μ½μ μ μ΄ λμ΄ λ°μ΄ν° μ ν©μ±μ λ¬Έμ κ° μκΉλλ€ π₯
μ΄κ² κ°λ₯ν μ΄μ λ λ°λ‘ InnoDB μμ§μ΄ νΈλμμ μ 컀λ°νλ λ°©μ λλ¬Έμ λλ€.
InnoDB λ 컀λ°λμ§ μμ μμ μ΄λΌλ μ€νν 쿼리λ₯Ό DB μ μ μ©ν©λλ€.
μ¦, logλ₯Ό λ³΄κ³ νΉμ μμ μ snapshot μ 볡ꡬνλ consistent read λ₯Ό νμ§ μκ³ , ν΄λΉ μμ μ DB λ₯Ό λ°λ‘ μ½μΌλ©΄ Dirty Read κ° λ°μν©λλ€.
consistent read λ ?
SELECT μ νμ¬ DB κ°μ΄ μλ νΉμ μμ μ DB snapshot μ μ½μ΄μ€λ λ°©μμ μλ―Έν©λλ€.
ν΄λΉ snapshot μ 컀λ°λ λ³νλ§μ ν¬ν¨νκ³ μμΌλ©°, InnoDB λ 쿼리 μ€ν μ ν΄λΉ μμ μ DB snapshot μ 볡ꡬνκΈ° μν΄ log λ₯Ό μ¬μ©ν©λλ€.
3-2. Non-Repeatable Read (λΉλ°λ³΅ μ½κΈ°)
ν νΈλμμ μμ κ°μ 쿼리λ₯Ό λ λ² μ€ννμ λ κ·Έ μ¬μ΄μ λ€λ₯Έ νΈλμμ μ΄ κ°μ μμ νκ±°λ μμ νμ¬ λ 쿼리μ κ²°κ³Όκ° λ¬λΌμ§λ νμμ μλ―Έν©λλ€.
μλ₯Ό λ€μ΄μ
- νΈλμμ Aκ° SELECT balance FROM account WHERE id = 1μ μ€ννμ¬ κ³μ’ μμ‘μ μ‘°νν©λλ€.
- κ·Έ μ¬μ΄μ νΈλμμ Bκ° ν΄λΉ κ³μ’μ μμ‘μ μ λ°μ΄νΈνκ±°λ μμ ν©λλ€.
- νΈλμμ Aκ° λ€μ κ°μ 쿼리λ₯Ό μ€ννλ©΄, λ λ²μ§Έ κ²°κ³Όλ 첫 λ²μ§Έμ λ¬λΌμ§ μ μμ΅λλ€.
μ΄λ‘ μΈν΄ ν νΈλμμ λ΄μμ μΌκ΄μ± μλ κ²°κ³Όκ° λ°μν©λλ€.
3-3. Phantom Read (κ°μ μ½κΈ°)
ν νΈλμμ μμμ μΌμ λ²μμ λ μ½λλ₯Ό λλ² μ΄μ μ½μ λ, 첫λ²μ§Έ 쿼리μμ μλ λ μ½λκ° λλ²μ§Έ 쿼리μμ λνλλ νμμ μλ―Έν©λλ€.
μλ₯Ό λ€μ΄μ
- νΈλμμ Aκ° νΉμ λ²μμ λ°μ΄ν°λ₯Ό μ‘°ννλ SELECT 쿼리λ₯Ό μ€νν©λλ€. μλ₯Ό λ€μ΄, balance > 1000 쑰건μΌλ‘ μ‘°νν κ²°κ³Όκ° A νΈλμμ λ΄μμ 5κ°μ λ μ½λλ₯Ό λ°ννλ€κ³ κ°μ ν©λλ€.
- κ·Έ μ¬μ΄μ νΈλμμ Bκ° λμΌν λ²μμ λ°μ΄ν°λ₯Ό μ½μ νκ±°λ μμ ν©λλ€. μλ₯Ό λ€μ΄, balance > 1000 쑰건μ λ§λ μλ‘μ΄ λ μ½λλ₯Ό μ½μ ν©λλ€.
- νΈλμμ Aκ° λ€μ κ°μ λ²μμ λ°μ΄ν°λ₯Ό μ‘°ννλ©΄, 첫 λ²μ§Έ 쿼리μμ μλ λ μ½λκ° λ λ²μ§Έ 쿼리μμ λνλλ νμμ΄ λ°μν©λλ€.
μ΄λ‘ μΈν΄, νΈλμμ λ΄μμ μΌκ΄μ± μλ λ°μ΄ν° κ²°κ³Όλ₯Ό λ³΄κ² λμ΄, λ°μ΄ν° μ ν©μ±μ λ¬Έμ κ° μκΈΈ μ μμ΅λλ€.
3-4. νΈλμμ 격리 μμ€
μμ 3κ°μ§ λ¬Έμ κ° λ°μνλμ§ μ¬λΆμ λ°λΌμ νΈλμμ 격리 μμ€μ΄ κ²°μ λλλ°, 그건 μλ νμ κ°μ΄ κ²°μ λ©λλ€
λΆλ¦¬ λ 벨 | Dirty Read | Non-Repeatable Read | Phantom Read |
READ UNCOMMITEED | O | O | O |
READ COMMITTED | - | O | O |
REPEATABLE READ | - | - | O |
SERIALIZABLE | - | - | - |
- READ UNCOMMITTED
- λ¬Έμ λ°μ : Dirty Read, Non-Repeatable Read, Phantom Read λ°μ
- 컀λ°λμ§ μμ λ°μ΄ν°λ₯Ό μ½μ μ μμ΅λλ€.
- μ€λΌν΄μ μ΄ κ²©λ¦¬ μμ€μ μ§μνμ§ μμ΅λλ€.
- READ COMMITTED
- λ¬Έμ λ°μ : Non-Repeatable Read, Phantom Read λ°μ
- 컀λ°λ λ°μ΄ν°λ§ μ½μ μ μμ΅λλ€.
- DB2, SQL Server, Sybase μ κ²½μ° S-Lock νλμ λ μ½λλ₯Ό μ½μ λ Lock μ μ€μ νκ³ , ν΄λΉ λ μ½λμμ λΉ μ§λ μκ° Lock μ ν΄μ νλ λ°©μμΌλ‘ S-Lock μ μ΄μ©ν΄μ ꡬνν©λλ€.
- REPEATABLE READ
- λ¬Έμ λ°μ : Phantom Read λ°μ
- κ°μ νΈλμμ λ΄μμ λ°λ³΅λλ μ‘°νλ νμ κ°μ κ°μ μ‘°νν©λλ€.
- νΈλμμ μ΄ μμλ λμ μμ μ κΈ°μ€μΌλ‘ μΌκ΄λ λ°μ΄ν°λ₯Ό μ 곡ν©λλ€
- InnoDB μ κΈ°λ³Έ 격리 μμ€μ λλ€.
- SERIALIZABLE
- λ¬Έμ λ°μ : λͺ¨λ λ¬Έμ κ° λ°μνμ§ μμ΅λλ€.
- κ°μ₯ λμ 격리 μμ€μΌλ‘, νΈλμμ μ΄ μλ£λ λκΉμ§ λ°μ΄ν°μ λν μ λ°μ΄νΈλ μ½μ μ΄ λΆκ°λ₯ν©λλ€
- λͺ¨λ SELECT μμ ν΄λΉ νμ S-Lock μ΄ κ±Έλ¦¬λ―λ‘ λμμ±μ΄ κ°μ₯ λ¨μ΄μ§κ³ , Deadlock μ΄ λ°μν μ μμ΅λλ€.
- λ§μ΄ μ¬μ©νμ§ μμ΅λλ€.
4. βοΈ μ€νλ§μμ νΈλμμ μ¬μ©νλ λ²
μ€νλ§μμλ @Transactional μ΄λ Έν μ΄μ μ μ¬μ©ν΄ νΈλμμ μ μ½κ² μ²λ¦¬ν μ μμ΅λλ€.
μ΄ μ΄λ Έν μ΄μ μ λ©μλλ ν΄λμ€μ μ μ©ν μ μμΌλ©°, νΈλμμ μ μμκ³Ό λμ μλμΌλ‘ κ΄λ¦¬ν©λλ€ !
import org.springframework.transaction.annotation.Transactional;
@Transactional
class Test {
}
μ μ½λμ²λΌ @Transactional μ΄λ Έν μ΄μ μ λ©μλλ ν΄λμ€μ μΆκ°νλ©΄ ν΄λΉ λ©μλ λλ ν΄λμ€ λ΄μμ μνλλ λͺ¨λ λ°μ΄ν°λ² μ΄μ€ μμ μ΄ νΈλμμ μΌλ‘ λ¬Άμ λλ€
λν, 격리μμ€λ μ€μ ν μ μλλ°μ.
@Transactional μ΄λ Έν μ΄μ μμ isolation μμ±μ μ¬μ©νλ©΄ λ©λλ€
μλ₯Ό λ€μ΄, 격리 μμ€μ SERIALIZABLEλ‘ μ€μ νλ €λ©΄ λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€.
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Isolation;
@Transactional(isolation = Isolation.SERIALIZABLE)
class Test {
}
'ποΈ λ°μ΄ν°λ² μ΄μ€' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Lock μ΄ μ 리2 - λκ΄μ λ½, λΉκ΄μ λ½, λ°λλ½, λΆμ°λ½ (1) | 2025.02.28 |
---|---|
Lock μ΄ μ 리1 - κΈ°λ³Έμ μΈ λ½ κ°λ & DB λ΄λΆ λ½ κ΅¬μ‘° (0) | 2025.02.14 |
μΈλ±μ€μ μ’ λ₯μ λν΄μ μμ보μ ! (0) | 2025.02.01 |
DB μΈλ±μ€ κ°λ μ 리: μ μ₯ ꡬ쑰, μμ± κ³Όμ , λμ μ리 (1) | 2024.12.12 |