π[Spring] @Transactional
μ λ
Έν
μ΄μ
.
-
@Transactional
μ λ Έν μ΄μ μ Spring Frameworkμμ μ 곡νλ μ λ Έν μ΄μ μΌλ‘, λ©μλλ ν΄λμ€μ μ μ©νμ¬ ν΄λΉ λ²μ λ΄μ λ°μ΄ν°λ² μ΄μ€ μμ μ νλμ νΈλμμ μΌλ‘ κ΄λ¦¬ν μ μλλ‘ ν΄μ€λλ€.- μ¦,
@Transactional
μ μ¬μ©νλ©΄ μ§μ λ λ©μλ λλ ν΄λμ€ λ΄μ λ°μ΄ν°λ² μ΄μ€ μμ μ΄ λͺ¨λ μ±κ³΅ν΄μΌλ§ 컀λ°(commit)λκ³ , κ·Έλ μ§ μμΌλ©΄ λ‘€λ°±(rollback)λ©λλ€.
- μ¦,
1οΈβ£ μ£Όμ κΈ°λ₯.
-
1. νΈλμμ
κ΄λ¦¬.
-
@Transactional
μ λ Έν μ΄μ μ΄ μ μ©λ λ©μλ λ΄μμ μνλλ λͺ¨λ λ°μ΄ν°λ² μ΄μ€ μμ (μ: INSERT, UPDATE, DELETE)μ νλμ νΈλμμ μΌλ‘ κ΄λ¦¬λ©λλ€.- λ§μ½ λ©μλ μ€ν μ€ μμΈκ° λ°μνλ©΄, ν΄λΉ νΈλμμ λ΄μ λͺ¨λ λ³κ²½ μ¬νμ΄ λ‘€λ°±λ©λλ€.
-
-
2. μ μ© λ²μ.
-
@Transactional
μ ν΄λμ€λ λ©μλμ μ μ©ν μ μμ΅λλ€. - ν΄λμ€μ μ μ©νλ©΄ ν΄λΉ ν΄λμ€μ λͺ¨λ λ©μλκ° νΈλμμ λ΄μμ μ€νλ©λλ€.
- λ©μ€νΈμ μ μ©λλ©΄ ν΄λΉ λ©μλλ§ νΈλμμ μΌλ‘ κ΄λ¦¬λ©λλ€.
-
-
3. νΈλμμ
μ ν(Propagation)
-
@Transactional
μ μ¬λ¬ μ ν(Propagation) μ΅μ μ μ 곡νμ¬ νΈλμμ μ΄ λ€λ₯Έ νΈλμμ κ³Ό μ΄λ»κ² μνΈμμ©ν μ§λ₯Ό μ μν μ μμ΅λλ€.-
REQUIRED
: κΈ°λ³Έκ°μΌλ‘, νμ¬ νΈλμμ μ΄ μ‘΄μ¬νλ©΄ μ΄λ₯Ό μ¬μ©νκ³ , μμΌλ©΄ μλ‘μ΄ νΈλμμ μ μμ±ν©λλ€. -
REQUIRES_NEW
: νμ μλ‘μ΄ νΈλμμ μ μμ±νκ³ , κΈ°μ‘΄ νΈλμμ μ μΌμ μ μ§ν©λλ€. -
MANDATORY
: νμ¬ νΈλμμ μ΄ λ°λμ μ‘΄μ¬ν΄μΌ νλ©°, μμΌλ©΄ μμΈκ° λ°μν©λλ€. -
SUPPORT
: νμ¬ νΈλμμ μ΄ μμΌλ©΄ μ΄λ₯Ό μ¬μ©νκ³ , μμΌλ©΄ νΈλμμ μμ΄ μ€νν©λλ€. - κΈ°ν :
NOT_SUPPORT
,NEVER
,NESTED
λ±.
-
-
-
4. νΈλμμ
격리 μμ€(Isolation Level)
- λ°μ΄ν°λ² μ΄μ€ νΈλμμ
μ 격리 μμ€μ μ€μ ν μ μμ΅λλ€.
- μ΄λ λμμ μ€νλλ μ¬λ¬ νΈλμμ
κ°μ μνΈμμ© λ°©μμ μ μν©λλ€.
-
READ_UNCOMMITTED
: λ€λ₯Έ νΈλμμ μ λ―Έμλ£ λ³κ²½ μ¬νμ μ½μ μ μμ΅λλ€. -
READ_COMMITED
: λ€λ₯Έ νΈλμμ μ 컀λ°λ λ³κ²½ μ¬νλ§ μ½μ μ μμ΅λλ€. -
REPEATABLE_READ
: νΈλμμ λμ λμΌν λ°μ΄ν°λ₯Ό λ°λ³΅μ μΌλ‘ μ½μ΄λ λμΌν κ²°κ³Όλ₯Ό 보μ₯ν©λλ€. -
SERIALIZABLE
: κ°μ₯ μ격ν 격리 μμ€μΌλ‘, νΈλμμ μ΄ μμ ν μμ°¨μ μΌλ‘ μ€νλλλ‘ λ³΄μ₯ν©λλ€.
-
- μ΄λ λμμ μ€νλλ μ¬λ¬ νΈλμμ
κ°μ μνΈμμ© λ°©μμ μ μν©λλ€.
- λ°μ΄ν°λ² μ΄μ€ νΈλμμ
μ 격리 μμ€μ μ€μ ν μ μμ΅λλ€.
-
5. λ‘€λ°± κ·μΉ(Rollback Rules)
- κΈ°λ³Έμ μΌλ‘
@Transactional
μRuntimeException
λλError
κ° λ°μνλ©΄ νΈλμμ μ λ‘€λ°±ν©λλ€.- νΉμ μμΈμ λν΄ λ‘€λ°±μ κ°μ νκ±°λ, λ‘€λ°±μ λ°©μ§νλλ‘ μ€μ ν μ μμ΅λλ€.
-
rollbackFor
λλnoRollbackFor
μμ±μ μ¬μ©νμ¬ μ΄ λμμ 컀μ€ν°λ§μ΄μ§ν μ μμ΅λλ€.
- κΈ°λ³Έμ μΌλ‘
-
6. μ½κΈ° μ μ©(Read-Only)
-
@Transactional(readOnly = true)
λ‘ μ€μ νλ©΄ νΈλμμ μ΄ λ°μ΄ν° μ½κΈ° μ μ©μΌλ‘ λμνλ©°, μ΄ κ²½μ° λ°μ΄ν° μμ μμ μ΄ μ΅μ νλ μ μμ΅λλ€.- μ£Όλ‘ SELECT 쿼리μμ μ¬μ©λ©λλ€.
2οΈβ£ μμ μ½λ
- μ£Όλ‘ SELECT 쿼리μμ μ¬μ©λ©λλ€.
-
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
@Transactional
public void performTransaction() {
// λ°μ΄ν°λ² μ΄μ€μ μλ‘μ΄ μν°ν° μΆκ°
myRepository.save(new MyEntity("Data1"));
// λ€λ₯Έ λ°μ΄ν°λ² μ΄μ€ μμ
μν
myRepository.updateEntity(1L, "UpdatedData");
// μμΈ λ°μ μ, μμ λͺ¨λ μμ
μ΄ λ‘€λ°±λ¨
if (someConditionFails()) {
throw new RuntimeException("Transaction failed, rolling back...");
}
}
@Transactional(readOnly = true)
public List<MyEntity> getEntities() {
return myRepository.findAll();
}
}
3οΈβ£ μμ½.
-
@Transactional
μ λ°μ΄ν°λ² μ΄μ€ νΈλμμ μ μ½κ² κ΄λ¦¬ν μ μλλ‘ ν΄μ£Όλ Springμ ν΅μ¬ μ λ Έν μ΄μ μ λλ€.- μ΄ μ λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ λ©μλλ ν΄λμ€μ λ°μ΄ν°λ² μ΄μ€ μμ
μ νλμ νΈλμμ
μΌλ‘ μ²λ¦¬νλ©°, μ€ν¨ μ μλμΌλ‘ λ‘€λ°±λ©λλ€.
- λν, νΈλμμ μ ν, 격리 μμ€, λ‘€λ°± κ·μΉ λ±μ ν΅ν΄ μΈλΆμ μΌλ‘ νΈλμμ μ λμμ μ μ΄ν μ μμ΅λλ€.
- μ΄ μ λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ λ©μλλ ν΄λμ€μ λ°μ΄ν°λ² μ΄μ€ μμ
μ νλμ νΈλμμ
μΌλ‘ μ²λ¦¬νλ©°, μ€ν¨ μ μλμΌλ‘ λ‘€λ°±λ©λλ€.
μ΄λ¬ν κΈ°λ₯ λλΆμ @Transactional
μ Spring μ ν리μΌμ΄μ
μμ λ°μ΄ν° μΌκ΄μ±κ³Ό 무결μ±μ μ μ§νλ λ° μ€μν μν μ ν©λλ€.