Transactional
μ΄ μ΄λ Έν μ΄μ μ μ¬μ©νλ©΄ λ©μλκ° νΈλμμ κ²½κ³μ ν¬ν¨λμ΄μΌ ν¨μ λνλ λλ€. Springμ μ΄ μ΄λ Έν μ΄μ μ κ°μ§νκ³ ν΄λΉ λ©μλκ° νΈμΆλ λ νΈλμμ μ μμνλ©°, λ©μλκ° μ’ λ£λ λ νΈλμμ μ 컀λ°νκ±°λ λ‘€λ°±ν©λλ€.
μ£Όμ νΉμ§ λ° μ£Όμ μ¬ν
Propaging(μ ν μ΅μ
):
νΈλμμ μ μ ν λμμ μ§μ νλ€
μ’
λ₯
1. REQUIRED
(νμν κ²½μ°):
REQUIRED
(νμν κ²½μ°):νΈλμμ μ΄ μ΄λ―Έ μ‘΄μ¬νλ©΄ κ·Έκ²μ μ¬μ©νκ³ , κ·Έλ μ§ μμΌλ©΄ μλ‘μ΄ νΈλμμ μ μμν©λλ€.
2.SUPPORTS
(μ§μνλ κ²½μ°):
SUPPORTS
(μ§μνλ κ²½μ°):νΈλμμ μ΄ μ΄λ―Έ μ‘΄μ¬νλ©΄ κ·Έκ²μ μ¬μ©νκ³ , κ·Έλ μ§ μμΌλ©΄ νΈλμμ μμ΄ μ€νλ©λλ€.
3. MANDATORY
(νμ):
MANDATORY
(νμ):νΈλμμ μ΄ μ΄λ―Έ μ‘΄μ¬ν΄μΌλ§ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ μμΈκ° λ°μν©λλ€.
4. REQUIRES_NEW
(νμ μλ‘μ΄ νΈλμμ
):
REQUIRES_NEW
(νμ μλ‘μ΄ νΈλμμ
):νμ μλ‘μ΄ νΈλμμ μ μμν©λλ€. μ΄λ―Έ μ‘΄μ¬νλ νΈλμμ μ μΌμ μ€λ¨λ©λλ€.
5. NOT_SUPPORTED
(νΈλμμ
μ§μ μ ν¨):
NOT_SUPPORTED
(νΈλμμ
μ§μ μ ν¨):νΈλμμ μ μ§μνμ§ μμμ νΈλμμ μΈλΆμμ μ€νλ©λλ€. μ΄λ―Έ μ‘΄μ¬νλ νΈλμμ μ μΌμ μ€λ¨λ©λλ€.
6. NEVER
(νΈλμμ
μ¬μ© κΈμ§):
NEVER
(νΈλμμ
μ¬μ© κΈμ§):νΈλμμ μ μ¬μ©ν΄μλ μ λλ©°, νΈλμμ μ΄ μ΄λ―Έ μ‘΄μ¬νλ©΄ μμΈκ° λ°μν©λλ€.
7. NESTED
(μ€μ²©λ νΈλμμ
):
NESTED
(μ€μ²©λ νΈλμμ
):νμ¬ νΈλμμ μ΄ μ‘΄μ¬νλ©΄ μ€μ²© νΈλμμ μ μμνκ³ , κ·Έλ μ§ μμΌλ©΄ μΌλ° νΈλμμ μ μμν©λλ€.
Isolation(격리 μμ€):
νΈλμμ μ 격리 μμ€μ μ§μ νλ€
μ’
λ₯
READ_UNCOMMITTED
(λ―ΈνμΈ μ½κΈ°):λ¬Έμ μ : Dirty Read (λλ¬μ΄ μ½κΈ°)
λ€λ₯Έ νΈλμμ μμ μμ§ μ»€λ°λμ§ μμ λ³κ²½ λ΄μ©μ μ½μ μ μμ΅λλ€.
μμ:
A μ¬μ©μκ° 10000μμ μν κ³μ’μ μ κΈνλ νΈλμμ μ μμνμ§λ§ μμ§ μ»€λ°νμ§ μμμ΅λλ€. μ΄ λ, B μ¬μ©μκ° κ³μ’ μμ‘μ μ‘°ννλ©΄ 10000μμ΄ λν΄μ§ μμ‘μ λ³Ό μ μμ΅λλ€. λ§μ½ A μ¬μ©μκ° νΈλμμ μ λ‘€λ°±νλ©΄ B μ¬μ©μλ μλͺ»λ μ 보λ₯Ό λ³Έ κ²μ΄ λ©λλ€.
READ_COMMITTED
(νμΈ μ½κΈ°):λ¬Έμ μ : Non-Repeatable Read (λΉλ°λ³΅ μ½κΈ°)
λ€λ₯Έ νΈλμμ μμ 컀λ°λ λ³κ²½ λ΄μ©λ§ μ½μ μ μμ΅λλ€.
μμ:
A μ¬μ©μκ° μμ μ κ³μ’ μμ‘μ μ‘°ννμ λ 50000μμ΄ λμ΅λλ€. κ·Έ μ¬μ΄ B μ¬μ©μκ° A μ¬μ©μμ κ³μ’μμ 20000μμ μΆκΈνμ΅λλ€. A μ¬μ©μκ° λ€μ μμ‘μ μ‘°ννλ©΄ 30000μμ΄ λμ΅λλ€. κ°μ νΈλμμ λ΄μμ λ λ²μ μ‘°ν κ²°κ³Όκ° λ€λ¦ λλ€.
REPEATABLE_READ
(λ°λ³΅ κ°λ₯ν μ½κΈ°):λ¬Έμ μ : Phantom Read (μ λ Ή μ½κΈ°)
νΈλμμ μ΄ μμν λ μ½μ λ°μ΄ν°λ ν΄λΉ νΈλμμ λμ λ€λ₯Έ νΈλμμ μ μν΄ λ³κ²½λμ§ μμ΅λλ€.
μμ:
A μ¬μ©μκ° 30μΈ μ΄νμ κ³ κ°μ μ‘°ννμ λ 5λͺ μ΄ λμ΅λλ€. κ·Έ μ¬μ΄ B μ¬μ©μκ° μλ‘μ΄ 30μΈ μ΄νμ κ³ κ°μ μΆκ°νμ΅λλ€. A μ¬μ©μκ° λ€μ 30μΈ μ΄νμ κ³ κ°μ μ‘°ννλ©΄ 6λͺ μ΄ λμ΅λλ€.
SERIALIZABLE
(μ§λ ¬ν κ°λ₯):νΈλμμ λ€μ΄ μμ°¨μ μΌλ‘ μ€νλμ΄ λμμ± λ¬Έμ κ° λ°μνμ§ μλλ‘ ν©λλ€.
μμ:
A μ¬μ©μκ° μμ μ κ³μ’ μμ‘μ λ³κ²½νλ νΈλμμ μ μμνλ©΄, κ·Έ λμ B μ¬μ©μλ A μ¬μ©μμ κ³μ’μ μ΄λ ν μμ λ μνν μ μμ΅λλ€. A μ¬μ©μμ νΈλμμ μ΄ μλ£λ λκΉμ§ κΈ°λ€λ €μΌ ν©λλ€
λμμ± λ¬Έμ
Dirty Reads (μ€μΌλ μ½κΈ°):
ν νΈλμμ μμ λ³κ²½λ (κ·Έλ¬λ μμ§ μ»€λ°λμ§ μμ) λ°μ΄ν°λ₯Ό λ€λ₯Έ νΈλμμ μμ μ½λ κ²½μ° λ°μν©λλ€. μ΄λ‘ μΈν΄ μμ§ νμ λμ§ μμ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ μμ μ μνν μ μμ΅λλ€.
ν΄κ²°λ°©λ²:
READ_COMMITTED
μ΄μμ 격리 μμ€μ μ¬μ©νμ¬ Dirty Readsλ₯Ό λ°©μ§ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ 컀λ°λ λ°μ΄ν°λ§ μ½κ² λ©λλ€.
Non-Repeatable Reads (λΉλ°λ³΅ κ°λ₯ν μ½κΈ°):
ν νΈλμμ λμ€μ κ°μ λ°μ΄ν°λ₯Ό λ λ² μ΄μ μ½μ λ, λ λ²μ§Έ μ½κΈ°μμ 첫 λ²μ§Έ μ½κΈ°μ λ€λ₯Έ κ°μ μ»λ κ²½μ° λ°μν©λλ€. μ΄λ λ€λ₯Έ νΈλμμ μ μν΄ ν΄λΉ λ°μ΄ν°κ° λ³κ²½λμκΈ° λλ¬Έμ λλ€.
ν΄κ²°λ°©λ²:
REPEATABLE_READ
μ΄μμ 격리 μμ€μ μ¬μ©νμ¬ Non-Repeatable Readsλ₯Ό λ°©μ§ν μ μμ΅λλ€. νΈλμμ μ΄ μμλ λ μ½μ λ°μ΄ν°λ ν΄λΉ νΈλμμ λμ λ³κ²½λμ§ μλλ‘ λ³΄μ₯λ©λλ€.
Phantom Reads (νμ μ½κΈ°):
ν νΈλμμ λμ€μ νΉμ 쑰건μ κΈ°λ°μΌλ‘ λ°μ΄ν°λ₯Ό λ λ² μ΄μ μ½μ λ, λ λ²μ§Έ μ½κΈ°μμ 첫 λ²μ§Έ μ½κΈ°μμ 보μλ λ°μ΄ν°μ μμ λ€λ₯΄κ² λνλλ κ²½μ° λ°μν©λλ€. μ΄λ λ€λ₯Έ νΈλμμ μ μν΄ μλ‘μ΄ λ°μ΄ν°κ° μΆκ°λκ±°λ μμ λμκΈ° λλ¬Έμ λλ€.
ν΄κ²°λ°©λ²:
SERIALIZABLE
격리 μμ€μ μ¬μ©νμ¬ Phantom Readsλ₯Ό λ°©μ§ν μ μμ΅λλ€. νΈλμμ λ€μ΄ μμ°¨μ μΌλ‘ μ€νλμ΄, ν νΈλμμ μ΄ μ€νλλ λμ λ€λ₯Έ νΈλμμ μμ λ°μ΄ν°μ μΆκ°λ μμ κ° λ°μνμ§ μλλ‘ ν©λλ€.
Timeout (μκ° μ΄κ³Ό):
timeout
μ΅μ μ ν΄λΉ νΈλμμ μ΄ μ§μ λ μκ° λ΄μ μλ£λμ§ μμΌλ©΄ κ°μ λ‘ λ‘€λ°±λ©λλ€.
Read-only (μ½κΈ° μ μ©):
readOnly
μ΅μ μ ν΄λΉ νΈλμμ λ΄μμ λ°μ΄ν° λ³κ²½ μμ μ΄ λ°μνλ©΄ μμΈκ° λ°μν©λλ€. μ½κΈ° μ μ© μμ μμλ μ±λ₯ ν₯μμ΄ μμ μ μμ΅λλ€.
μ±λ₯ ν₯μ μ΄μ :
μ΅μ νλ λ°μ΄ν°λ² μ΄μ€ μμ§ λμ:
λλΆλΆμ RDBMSλ μ¬λ¬ μ νμ λ½νΉ λ©μ»€λμ¦μ μ 곡ν©λλ€. μ½κΈ° μ μ© νΈλμμ μ κ²½μ°, λ°μ΄ν°λ² μ΄μ€λ λ°μ΄ν° λ³κ²½μ κ΄λ ¨λ λ½(μ: μ°κΈ° λ½)μ νλνλ κ²μ λ°©μ§ν μ μμ΅λλ€. μ΄λ‘ μΈν΄ μ½κΈ° μ μ© νΈλμμ μ λ€λ₯Έ νΈλμμ μ μν΄ λΈλ‘νΉλλ λΉλκ° μ€μ΄λ€ μ μμ΅λλ€.
μ: μμ μ μ¬κ³ νμΈ μμ€ν μμ, μ¬λ¬ μ¬μ©μκ° λμμ μ¬κ³ λ₯Ό νμΈνλ κ²½μ°μ, μ½κΈ° μ μ© νΈλμμ μ μ¬μ©νλ©΄ λ°μ΄ν°λ² μ΄μ€μμ μ¬κ³ μ 보λ₯Ό λΉ λ₯΄κ² κ°μ Έμ¬ μ μμ΅λλ€. λ°μ΄ν° λ³κ²½μ΄ μκΈ° λλ¬Έμ, μ°κΈ° λ½ μμ΄ μ 보λ₯Ό μ‘°νν μ μμ΄, λΈλ‘νΉ μμ΄ λμμ μ¬λ¬ μ¬μ©μμ μμ²μ μ²λ¦¬ν μ μμ΅λλ€.
λ²μ κ΄λ¦¬μ λ½νΉ μ΅μν:
ORM λꡬ(μ: Hibernate)λ λ°μ΄ν° λ³κ²½μ μΆμ νκΈ° μν΄ λ΄λΆμ μΌλ‘ λ²μ κ΄λ¦¬λ₯Ό μ¬μ©ν μ μμ΅λλ€. μ΄λ λ°μ΄ν°λ² μ΄μ€ νμ λν λ²μ λ²νΈλ₯Ό μ¬μ©νμ¬, λ μ¬μ©μκ° λμμ κ°μ λ°μ΄ν°λ₯Ό μμ νλ μν©(λμμ± λ¬Έμ )μ ν΄κ²°νλλ° λμμ μ€λλ€. κ·Έλ¬λ μ½κΈ° μ μ© νΈλμμ μμλ λ°μ΄ν° λ³κ²½μ΄ μμΌλ―λ‘, μ΄λ¬ν λ²μ κ΄λ¦¬κ° νμ μμ΄μ§λλ€.
μ: μνμ κ³μ’ μμ‘ νμΈ μμ€ν μμ, μ¬μ©μκ° μμ‘λ§ νμΈνλ €λ κ²½μ°, μ½κΈ° μ μ© νΈλμμ μ μ¬μ©νλ©΄ ORMμ΄ λ²μ κ΄λ¦¬λ λ½νΉ λ©μ»€λμ¦μ μ μ©νμ§ μμλ λλ―λ‘, μλ΅ μλκ° ν₯μλ μ μμ΅λλ€.
μΊμ± ν¨μ¨μ±:
ORM νλ μμν¬λ μ’ μ’ μΏΌλ¦¬ κ²°κ³Όλ₯Ό μΊμνμ¬, λμΌν 쿼리μ λν΄ λΉ λ₯Έ μλ΅ μκ°μ μ 곡ν©λλ€. μ½κΈ° μ μ© νΈλμμ μμλ λ°μ΄ν° λ³κ²½μ΄ μκΈ° λλ¬Έμ, μΊμλ λ°μ΄ν°μ μ ν¨μ±μ λν μ°λ €κ° μ€μ΄λλλ€.
μ: λ΄μ€ μΉμ¬μ΄νΈμμ, μ¬μ©μκ° νΉμ μΉ΄ν κ³ λ¦¬μ λ΄μ€ λͺ©λ‘μ μ‘°ννλ κ²½μ°, μ½κΈ° μ μ© νΈλμμ μ μ¬μ©νλ©΄ ORM νλ μμν¬λ μ΄μ μ μ‘°νλ κ²°κ³Όλ₯Ό μΊμμμ λΉ λ₯΄κ² κ°μ Έμ¬ μ μμ΅λλ€.
μΌκ΄μ± μ μ§:
μ½κΈ° μ μ© νΈλμμ μ μ€μλ‘ λ°μ΄ν° λ³κ²½μ λ°©μ§ν©λλ€. μλμΉ μκ² λ°μ΄ν°λ₯Ό λ³κ²½νλ κ²μ μ±λ₯ λ¬Έμ λΏλ§ μλλΌ λ°μ΄ν° λ¬΄κ²°μ± λ¬Έμ λ₯Ό μΌκΈ°ν μ μμ΅λλ€.
μ: λ³μ μμ€ν μμ, νμμ λ³λ ₯μ νμΈνλ κ²½μ°, μ½κΈ° μ μ© νΈλμμ μ μ¬μ©νλ©΄, μ€μλ‘ νμ μ 보λ₯Ό λ³κ²½νλ κ²μ λ°©μ§ν μ μμ΅λλ€.
Rollback rules (λ‘€λ°± κ·μΉ):
κΈ°λ³Έμ μΌλ‘ λ°νμ μμΈ(
RuntimeException
λ° κ·Έ νμ μμΈ)κ° λ°μνλ©΄ λ‘€λ°±μ μνν©λλ€rollbackFor
μ΄ μμ±μ μ¬μ©νλ©΄ νΉμ μμΈκ° λ°μνμ λ νΈλμμ μ λ‘€λ°±νλ κ·μΉμ μ§μ ν μ μμ΅λλ€.
noRollbackFor
μ΄ μμ±μ μ§μ λ μμΈ μ νμ λν λ‘€λ°±μ λ°©μ§ν©λλ€. μ¦, ν΄λΉ μμΈκ° λ°μνλλΌλ νΈλμμ μ λ‘€λ°±λμ§ μμ΅λλ€.
AOP (κ΄μ μ§ν₯ νλ‘κ·Έλλ°):
λ΄λΆ λ©μλ νΈμΆμμλ **
@Transactional
**μ΄ μ λλ‘ λμνμ§ μλ λ¬Έμ λ Springμ νλ‘μ λ°©μ λλ¬Έμ λλ€. ν΄λΉ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ λ©μλ νΈμΆμ μΈλΆ λΉμ ν΅ν΄ κ°μ μ μΌλ‘ μννκ±°λ, νλ‘κ·Έλ¨ κ΅¬μ‘°λ₯Ό λ³κ²½ν΄μΌ ν©λλ€.
Last updated
Was this helpful?