Transaction, @Transactional
νΈλμμ
μ΄λ?
νΈλμμ μ 'νλμ λ Όλ¦¬μ μΈ μμ λ¨μ'λ₯Ό μλ―Έν©λλ€. ν΅μ¬μ All or Nothingμ λλ€.
Commit: μμ μ΄ μ±κ³΅μ μΌλ‘ λλμ κ²°κ³Όλ₯Ό νμ μ§λ κ².
Rollback: μμ μ€ νλλΌλ μ€ν¨νλ©΄, λͺ¨λ μμ μ μ·¨μνκ³ μ²μ μνλ‘ λλ리λ κ².
[μμ: νκΈΈλμ΄ μκΊ½μ μκ² 3,000μμ μ΄μ²΄νλ€λ©΄?]
μ΄μ²΄ λ‘μ§μ ν¬κ² 4λ¨κ³λ‘ μ§νλ©λλ€.
νκΈΈλ κ³μ’ μ‘°ν (μμ‘ 10,000μ)
νκΈΈλ κ³μ’μμ 3,000μ μ°¨κ° (μμ‘ 7,000μ)
μκΊ½μ κ³μ’ μ‘°ν (μμ‘ 10,000μ)
μκΊ½μ κ³μ’μ 3,000μ μΆκ° (μμ‘ 13,000μ)
[λ¬Έμ μν©] λ§μ½ 2λ²κΉμ§ μ±κ³΅νκ³ , 3λ²μμ "μλ κ³μ’λ²νΈμ λλ€"λΌλ©° μλ¬κ° λ°μνλ©΄ μ΄λ»κ² λ κΉμ? νΈλμμ μ΄ μλ€λ©΄ μκΊ½μ λμ κ·Έλλ‘μΈλ° νκΈΈλ λμ μ€μ΄λ , λμ΄ μ¬λΌμ§λ μ¬κ³ κ° λ°μν©λλ€. μ΄κ²μ΄ λ°λ‘ λ°μ΄ν° μΌκ΄μ±μ΄ κΉ¨μ§λ μν©μ λλ€.
Spring @Transactional μ μ©νκΈ°
μ€νλ§ νλ μμν¬μμλ @Transactional μ΄λ
Έν
μ΄μ
νλλ§ λΆμ΄λ©΄, 볡μ‘ν 컀λ°/λ‘€λ°± μ²λ¦¬λ₯Ό λμ ν΄ μ€λλ€.
[μλ리μ€]
μ μ μ΄μ²΄: Account A -> Account B (μ±κ³΅)
μ΄μ²΄ μ€ν¨: Account A -> Account 999(μλ κ³μ’) (μ€κ°μ μλ¬ λ°μ)
[1. νΈλμμ μ΄ μλ κ²½μ°]
κ²°κ³Ό:
1λ² μΆκΈμ μ΄λ―Έ DBμ λ°μλμ΄ λ²λ Έκ³ , 2λ²μμ μλ¬κ° λμ μ€λ¨λμμ΅λλ€.
λ°μ΄ν° λΆμΌμΉ(Inconsistency)κ° λ°μν©λλ€.
[2. νΈλμμ μ΄ μλ κ²½μ°]
κ²°κ³Ό:
2λ²μμ μλ¬(μμΈ)κ° λ°μνμ, μ€νλ§μ΄ μ΄λ₯Ό κ°μ§νκ³ μλμΌλ‘ λ‘€λ°±μ μνν©λλ€.
1λ² μΆκΈ λ΄μλ μ·¨μλμ΄ λ κ³μ’ λͺ¨λ μ΄κΈ° μν(10,000μ)λ₯Ό μ μ§ν©λλ€. λ°μ΄ν° μΌκ΄μ±μ΄ μ§μΌμ§ κ²μ λλ€.
@Transactional μ¬μ© μ μ£Όμμ
@Transactionalμ κ°λ°μλ₯Ό νΈνκ² ν΄μ£Όμ§λ§, κ·Έλ§νΌ λμ μ리λ₯Ό μ μμμΌ μ€μλ₯Ό λ§μ μ μμ΅λλ€.
1. λμ μ리: AOP (Aspect Oriented Programming)
μ΄ μ΄λ Έν μ΄μ μ λΆμ΄λ©΄ μ€νλ§μ νλ‘μ(Proxy)λΌλ κ°μ§ κ°μ²΄λ₯Ό λ§λ€μ΄ μλ¨μ μΈμλλ€.
νλ‘μκ° νΈλμμ μ μμ(
BEGIN)νκ³ ,μ€μ λ©μλλ₯Ό νΈμΆν λ€,
μ±κ³΅νλ©΄
COMMIT, μμΈκ° ν°μ§λ©΄ROLLBACKμ μνν©λλ€.
[μ£Όμν μ : Self-Invocation]
κ°μ ν΄λμ€ λ΄λΆμ λ©μλλΌλ¦¬ νΈμΆ(
this.method())ν λλ νλ‘μλ₯Ό κ±°μΉμ§ μκ³ μ§μ νΈμΆνκΈ° λλ¬Έμ νΈλμμ μ΄ μ μ©λμ§ μμ΅λλ€.
2. λ‘€λ°± κΈ°μ€
κΈ°λ³Έμ μΌλ‘ μ€νλ§μ RuntimeException (Unchecked Exception)μ΄ λ°μνμ λλ§ λ‘€λ°±ν©λλ€.
Checked Exceptionμ΄ λ°μν΄λ λ‘€λ°±νκ³ μΆλ€λ©΄?
rollbackFor = Exception.classμ΅μ μ μΆκ°ν΄μΌ ν©λλ€.
3. νΈλμμ
λ μ£Όμ μμ±
propagation (μ ν μμ±): μ΄λ―Έ μ§ν μ€μΈ νΈλμμ μ΄ μμ λ, ν©λ₯ν μ§ μλ‘ λ§λ€μ§ κ²°μ ν©λλ€. (λΆλͺ¨-μμ νΈλμμ μ μ΄)
isolation (격리 μμ€): μ¬λ¬ νΈλμμ μ΄ λμμ μ€νλ λ μλ‘ μΌλ§λ μν₯μ μ£Όκ³ λ°μμ§ μ€μ ν©λλ€. (λμμ± λ¬Έμ μ μ§κ²°λ¨)
readOnly (μ½κΈ° μ μ©):
trueλ‘ μ€μ νλ©΄ λ°μ΄ν° λ³κ²½μ λ§κ³ , μ±λ₯ μ΅μ ν(λν° μ²΄νΉ μλ΅ λ±)λ₯Ό λμ΅λλ€.
Last updated