Transactionμ μΌκ΄μ±μ λνλ΄λ 격리 μμ€μ λͺ μνλ€. μμΈν¨ μ¬νμ Transaction Isolation Level μ°Έμ‘°
Recommandλλ λ°©μμΌλ‘λ Readμμλ REPEATABLE READ, Create, Update, Delete λλ SERIALIZABLE
κΈ°λ³Έ 격리μμ€μΌλ‘ DBμ κΈ°λ³Έ Isolcation Levelμ λ°λΌκ°
- 컀λ°λμ§ μλ λ°μ΄ν°μ λν μ½κΈ°λ₯Ό νμ©
Dirty Readλ°μ
- 컀λ°λ λ°μ΄ν°λ§ μ½κΈ° νμ©
Dirty Readλ°©μ§νλ€.- νλμ Transaction μμμ Selectμλ§λ€ κ°μ΄ λ€λ₯Όμκ° μλ
Non-Repeatable Readλ¬Έμ λ°μ
- νΈλμ μ μ΄ μλ£λ λκΉμ§ selectμμ μ¬μ©νλ λͺ¨λ λ°μ΄ν°μ shared lockμ΄ κ±Έλ¦Ό (λ€λ₯Έκ³³μμ μμ λΆκ°λ₯)
- νΈλμ μ λ΄λΆμμ μΌκ΄μ±μλ λ°μ΄ν° 보μ¦
Non-Repeatable Readλ°©μ§
- λ°μ΄ν°μ μΌκ΄μ± λ° λμμ±μ μν΄ MVCC(Multi Version Concurrency Control) μ¬μ©νμ§ μμ
- νΈλμμ μ΄ μλ£λ λκΉμ§ SELECT λ¬Έμ₯μ΄ μ¬μ©νλ λͺ¨λ λ°μ΄ν°μ shared lockμ΄ κ±Έλ¦¬λ―λ‘ λ€λ₯Έ μ¬μ©μλ κ·Έ μμμ ν΄λΉλλ λ°μ΄ν°μ λν μμ λ° μ λ ₯μ΄ λΆκ°λ₯νλ€.
Phantom Readλ°©μ§
νΈλμμ
λμ λμ€ λ€λ₯Έ νΈλμμ
μ νΈμΆ(μ€ν)νλ μν©μ μ νν μ μλ μ΅μ
@Transactionalμ propagation μμ±μ ν΅ν΄ νΌνΈμΆ νΈλμμ
μ μ
μ₯μμλ νΈμΆν μͺ½μ νΈλμμ
μ κ·Έλλ‘ μ¬μ©ν μλ μκ³ , μλ‘κ² νΈλμμ
μ μμ±ν μλ μλ€.
Default μμ±μΌλ‘ λΆλͺ¨ νΈλμ μ μ΄ μλ κ²½μ° μ°Έμ¬νκ³ μλκ²½μ°μλ μλ‘μ΄ νΈλμ μ μ μμ±νλ€. λ³΄ν΅ μ΄ μ€μ μΌ λλΆλΆ λ¬Έμ λ ν΄κ²°λλ€.
μ΄λ―Έ μμλ νΈλμμ μ΄ μμΌλ©΄ μ°Έμ¬νκ³ κ·Έλ μ§ μμΌλ©΄ νΈλμμ μμ΄ μ§ν νΈλμ μ μ΄ μμ΄λ νΈλμ μ μ κ²½κ³μμ Connectionμ΄λ νμ΄λ²λ€μ΄νΈμ Sessionμ 곡μ ν μ μλ€.
REQUIREDμ λΉμ·νκ² μ΄λ―Έ μμλ νΈλμμ μ΄ μμΌλ©΄ μ°Έμ¬νλ€. λ°λ©΄μ νΈλμμ μ΄ μμλ κ²μ΄ μμΌλ©΄ μλ‘ μμνλ λμ μμΈλ₯Ό λ°μμν¨λ€. νΌμμλ λ 립μ μΌλ‘ νΈλμμ μ μ§ννλ©΄ μ λλ κ²½μ°μ μ¬μ©
λΆλͺ¨μ νΈλμ μ μ μκ΄μμ΄ νμ μλ‘μ΄ νΈλμμ μ μμνλ€. μ΄λ―Έ μ§ν μ€μΈ νΈλμμ μ΄ μμΌλ©΄ νΈλμμ μ μ μ 보λ₯μν¨λ€.
νΈλμμ μ μ¬μ©νμ§ μκ² νλ€. μ΄λ―Έ μ§ν μ€μΈ νΈλμμ μ΄ μμΌλ©΄ 보λ₯μν¨λ€.
νΈλμμ μ μ¬μ©νμ§ μλλ‘ κ°μ νλ€. μ΄λ―Έ μ§ν μ€μΈ νΈλμμ λ μ‘΄μ¬νλ©΄ μλλ€ μλ€λ©΄ μμΈλ₯Ό λ°μμν¨λ€.
μ΄λ―Έ μ§νμ€μΈ νΈλμμ μ΄ μμΌλ©΄ μ€μ²© νΈλμμ μ μμνλ€. μ€μ²© νΈλμμ μ νΈλμμ μμ λ€μ νΈλμμ μ λ§λλ κ²μ΄λ€. νμ§λ§ λ 립μ μΈ νΈλμμ μ λ§λλ REQUIRES_NEWμλ λ€λ₯΄λ€. μ€μ²©λ νΈλμμ μ λ¨Όμ μμλ λΆλͺ¨ νΈλμμ μ 컀λ°κ³Ό λ‘€λ°±μλ μν₯μ λ°μ§λ§ μμ μ 컀λ°κ³Ό λ‘€λ°±μ λΆλͺ¨ νΈλμ μ μκ² μν₯μ μ£Όμ§ μλλ€.
ν΄λΉ μμ μ λ‘κ·Έμ λν μ 보λ₯Ό μμλ μ μ©νκ² μ¬μ©ν μ μλ€. λ©μΈ νΈλμ μ μ΄ λλκΈ°μ μ λ‘κ·Έλ₯Ό κΌ DBμ μ μ₯νμ¬μΌ ν λ λ‘κ·Έ DBκ° μ μ₯μ μ€ν¨νλλΌλ λΆλͺ¨μ μλ νΈλμ μ μ μν₯μ μ£Όμ΄μλ μλλ€. νμ§λ§ λ‘κ·Έλ₯Ό λ¨κΈ΄ ν λΆλͺ¨μ νΈλμ μ μ΄ μ€ν¨νλ€λ©΄ κ°μ΄ Rollback λμ΄μΌ νλ μν©μ΄κΈ°μ ν΄λΉ μμ μμλ NESTEDκ° μ ν©νλ€.
μ€μ²© νΈλμμ μ JDBC 3.0 μ€νμ μ μ₯ν¬μΈνΈ(savepoint) (ν΄λ¦μ μμΈν λ΄μ©λ§ν¬) λ₯Ό μ§μνλ λλΌμ΄λ²μ DataSourceTransactionManager λ₯Ό μ΄μ©ν κ²½μ°μ μ μ© κ°λ₯νλ€.
νΈλμμ μ μ½κΈ° μ μ©μΌλ‘ μ€μ μ±λ₯μ μ΅μ ννκΈ° μν΄ μ¬μ©ν μλ μκ³ νΉμ νΈλμμ μμ μμμ μ°κΈ° μμ μ΄ μΌμ΄λλ κ²μ μλμ μΌλ‘ λ°©μ§νκΈ° μν΄ μ¬μ©ν μλ μλ€. μΌλ°μ μΌλ‘ μ½κΈ° μ μ© νΈλμμ μ΄ μμλ μ΄ν INSERT, UPDATE, DELETE κ°μ μ°κΈ° μμ μ΄ μ§νλλ©΄ μμΈκ° λ°μνλ€.
νμ΄λ²λ€μ΄νΈλ₯Ό μ¬μ©νλ κ²½μ°μλ FlushModeλ₯Ό Manualλ‘ λ³κ²½νμ¬ dirty checkingμ μλ΅
DBμ λ°λΌ DataSourceμ Connection λ 벨μλ μ€μ λμ΄ μ½κ°μ μ΅μ νκ° κ°λ₯
μΌλΆ νΈλμμ λ§€λμ μ κ²½μ° μ½κΈ°μ μ© μμ±μ 무μνκ³ μ°κΈ° μμ μ νμ©ν μλ μκΈ° λλ¬Έμ μ£Όμ
νΉμ μμΈκ° λ°μ μ κ°μ λ‘ Rollback μν¬μ§μ μ¬λΆλ₯Ό μ€μ ν¨μΌλ‘ μμ noκ° λΆμΌλ©΄ ν΄λΉ μμΈλ λ‘€λ°±μ ν¬ν¨μν€μ§ μλλ€.
μ΄λ Έν μ΄μ μ μ§μ ν μκ°κΉμ§ ν΄λΉ λ©μλ μνμ΄ μλ£λμ§ μλ κ²½μ°μλ rollbackμ μ€ννλ€. μ§μ λ κ°μ΄ -1μΌ κ²½μ°μλ Timeout μκ°μμ΄ λ¬΄νμ λκΈ°νλ€.