Spring Transaction μ΅μ
μν©
μ€νλ§ νκ²½μμ μΌλ°μ μΌλ‘ DAO λ BO λ 벨μμ λ€μκ³Ό κ°μ΄ μ½λ©μ νκ² λλ€.
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public int method(int i) throws Exception {
return sqlMapClient.delete("~~~~");
}
무λΆλ³νκ² Ctrl+C,V μ 곡μΌλ‘ νΈλμμ μ΄λ Έν μ΄μ μ κ°μ Έλ€κ° μ¬μ©ν μλ μκ² μΌλ, κ° κ°λ€μ΄ μ΄λ€ μνμ μλμ§μ λν΄ μκ³ λμ΄κ° νμμ±μ΄ μλ€.
@Transactional
μ°μ ν΄λΉ μ΄λ Έν μ΄μ μ μ μ©νλ©΄ μ μ©λ ν΄λμ€ λλ λ©μλμ νΈλμμ μ΄ μ μ©λλ€. λ°λΌμ λ‘μ§ νλ¦μ λ§μΆμ΄ μ 체μ μΌλ‘ νΈλμμ μ μ μ©ν κ²μΈμ§, μλλ©΄ νΉμ λ©μλμ μ μ©ν κ²μΈμ§ μ λ΅μ μ μΈμμΌ νλ€.
isolation
격리μμ€μ΄λΌλ μ΅μ μ΄λ€. νΈλμμ μμ μΌκ΄μ±μ΄ μλ λ°μ΄ν°λ₯Ό νμ©νλλ‘ νλ μμ€μ λ§νλλ° μ΅μ μ λ€μκ³Ό κ°λ€.
- READ_UNCOMMITTED (level 0)
- νΈλμμ μ μ²λ¦¬μ€μΈ νΉμ μμ§ μ»€λ°λμ§ μμ λ°μ΄ν°λ₯Ό λ€λ₯Έ νΈλμμ μ΄ μ½λ κ²μ νμ©
- μ΄λ€ μ¬μ©μκ° AλΌλ λ°μ΄ν°λ₯Ό BλΌλ λ°μ΄ν°λ‘ λ³κ²½νλ λμ λ€λ₯Έ μ¬μ©μλ BλΌλ μμ§ μλ£λμ§ μμ(Uncommitted νΉμ Dirty) λ°μ΄ν° Bλ₯Ό μ½μ μ μλ€.
Dirty read : μμ κ°μ΄ λ€λ₯Έ νΈλμμ μμ μ²λ¦¬νλ μμ μ΄ μλ£λμ§ μμλλ°λ λ€λ₯Έ νΈλμμ μμ λ³Ό μ μλ νμμ dirty read λΌκ³ νλ©°, READ UNCOMMITTED 격리μμ€μμλ§ μΌμ΄λλ νμ
- READ_COMMITTED (level 1)
- dirty read λ°©μ§ : νΈλμμ μ΄ μ»€λ°λμ΄ νμ λ λ°μ΄ν°λ§μ μ½λ κ²μ νμ©
- μ΄λ ν μ¬μ©μκ° AλΌλ λ°μ΄ν°λ₯Ό BλΌλ λ°μ΄ν°λ‘ λ³κ²½νλ λμ λ€λ₯Έ μ¬μ©μλ ν΄λΉ λ°μ΄ν°μ μ κ·Όν μ μλ€.
- REPEATABLE_READ (level 2)
- νΈλμμ μ΄ μλ£λ λκΉμ§ SELECT λ¬Έμ₯μ΄ μ¬μ©νλ λͺ¨λ λ°μ΄ν°μ shared lockμ΄ κ±Έλ¦¬λ―λ‘ λ€λ₯Έ μ¬μ©μλ κ·Έ μμμ ν΄λΉλλ λ°μ΄ν°μ λν μμ μ΄ λΆκ°λ₯νλ€.
- μ ν νΈλμμ μ΄ μ½μ λ°μ΄ν°λ νΈλμμ μ΄ μ’ λ£λ λκΉμ§ νν νΈλμμ μ΄ κ°±μ νκ±°λ μμ νλ κ²μ λΆνν¨μΌλ‘μ¨ κ°μ λ°μ΄ν°λ₯Ό λ λ² μΏΌλ¦¬νμ λ μΌκ΄μ± μλ κ²°κ³Όλ₯Ό 리ν΄ν¨
- SERIALIZABLE (level 3)
- μλ²½ν μ½κΈ° μΌκ΄μ± λͺ¨λλ₯Ό μ 곡
- λ°μ΄ν°μ μΌκ΄μ± λ° λμμ±μ μν΄ MVCC(Multi Version Concurrency Control)μ μ¬μ©νμ§ μμ(MVCCλ λ€μ€ μ¬μ©μ λ°μ΄ν°λ² μ΄μ€ μ±λ₯μ μν κΈ°μ λ‘ λ°μ΄ν° μ‘°ν μ LOCKμ μ¬μ©νμ§ μκ³ λ°μ΄ν°μ λ²μ μ κ΄λ¦¬ν΄ λ°μ΄ν°μ μΌκ΄μ± λ° λμμ±μ λμ΄λ κΈ°μ )
- νΈλμμ μ΄ μλ£λ λκΉμ§ SELECT λ¬Έμ₯μ΄ μ¬μ©νλ λͺ¨λ λ°μ΄ν°μ shared lockμ΄ κ±Έλ¦¬λ―λ‘ λ€λ₯Έ μ¬μ©μλ κ·Έ μμμ ν΄λΉλλ λ°μ΄ν°μ λν μμ λ° μ λ ₯μ΄ λΆκ°λ₯νλ€.
propagation ( μ νμ΅μ )
- REQUIRED : λΆλͺ¨ νΈλμμ λ΄μμ μ€ννλ©° λΆλͺ¨ νΈλμμ μ΄ μμ κ²½μ° μλ‘μ΄ νΈλμμ μ μμ±
- REQUIRES_NEW : λΆλͺ¨ νΈλμμ μ 무μνκ³ λ¬΄μ‘°κ±΄ μλ‘μ΄ νΈλμμ μ΄ μμ±
- SUPPORT : λΆλͺ¨ νΈλμμ λ΄μμ μ€ννλ©° λΆλͺ¨ νΈλμμ μ΄ μμ κ²½μ° nontransactionallyλ‘ μ€ν
- MANDATORY : λΆλͺ¨ νΈλμμ λ΄μμ μ€νλλ©° λΆλͺ¨ νΈλμμ μ΄ μμ κ²½μ° μμΈκ° λ°μ
- NOT_SUPPORT : nontransactionallyλ‘ μ€ννλ©° λΆλͺ¨ νΈλμμ λ΄μμ μ€νλ κ²½μ° μΌμ μ μ§
- NEVER : nontransactionallyλ‘ μ€νλλ©° λΆλͺ¨ νΈλμμ μ΄ μ‘΄μ¬νλ€λ©΄ μμΈκ° λ°μ
- NESTED : ν΄λΉ λ©μλκ° λΆλͺ¨ νΈλμμ μμ μ§νλ κ²½μ° λ³κ°λ‘ 컀λ°λκ±°λ λ‘€λ°±λ μ μμ. λλ¬μΌ νΈλμμ μ΄ μμ κ²½μ° REQUIREDμ λμΌνκ² μλ
no-rollback-for - μμΈμ²λ¦¬ (κΈ°λ³Έκ° : μμ)
νΉμ μμΈκ° λ°μνλλΌλ λ‘€λ°±λμ§ μλλ‘ μ€μ
μ€νλ§ λ°°μΉμμμ νΈλμμ (λ΄κ° λΉνλ(?) λ¬Έμ )
μ€νλ§ λ°°μΉμμλ Tasklet μμ κΈ°λ³Έμ μΌλ‘ step λ¨μ νΈλμμ μ μ§μνκ³ μλ€κ³ νλ€. κΈ°λ³Έμ μΌλ‘ jobμ΄ νλμ tasklet μ step μΌλ‘ μ€ννλ€λ³΄λ λͺ μμ μ΄μ§ μμ§λ§ λ΄λΆμ μΌλ‘ μ 체 νΈλμμ μΌλ‘ κ±Έλ €μκ² λλ€. λκ°μ job λ΄ DAO delete λ©μλμμ @Transactional μ€μ μ νκ³ κ·Έ DAO λ©μλλ₯Ό λ°λ³΅λ¬Έμ μν΄ delete νλ λ‘μ§μ μννλ λΆλΆμ΄ μμλλ° λΆλͺ¨μ νΈλμμ (taskletμμ μ€μ λ νΈλμμ )μΌλ‘ μΈν΄ dao λ₯Ό λͺλ² νΈμΆνλ jobλ¨μλ‘ νΈλ μ μ μ΄ κ±Έλ¦¬κ² λμλ€. (κ²°κ΅ νΈλμμ μ λ°λ³΅λ¬Έμ΄ λ€ λλμΌ μ μ©μ΄ λλ€λμ .) κ·Έλ¬λ€λ³΄λ κ°λ DB Query Lockμ΄ κ±Έλ Έλλ° DBλ 벨μμ undologλ₯Ό λ¨κΈ°λκ² λ무 무거μμ Έ lockμ΄ λ°μ
λ°λΌμ μ νμ΅μ μ μμ ν΄μ ν΄λΉ λ¬Έμ λ₯Ό ν΄κ²°νμλ€.
# κΈ°μ‘΄
begin
delete < for λ°λ³΅λ¬Έ
commit
# μ νμ΅μ
μμ (κΈ°μ‘΄ REQUIRES μμ REQUIRES_NEW μΌλ‘ μμ )
for
begin
delete
commit
for end
Buy me a coffee