[Spring] Transaction

maxxyoungΒ·2021λ…„ 9μ›” 1일
0

πŸŒŒνŠΈλžœμž­μ…˜μ΄λž€?

ν•˜λ‚˜μ˜ 일처리λ₯Ό μ•ˆμ „ν•˜κ²Œ 보μž₯ν•΄μ£ΌλŠ” 것을 λœ»ν•¨
λͺ¨λ“  μž‘μ—…μ΄ μ„±κ³΅ν•΄μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ— 정상 λ°˜μ˜ν•˜λŠ” 것을 Commitμ΄λΌν•˜κ³ , μž‘μ—… 쀑 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•΄μ„œ μ΄μ „μœΌλ‘œ λ˜λŒλ¦¬λŠ” 것을 Rollback이라함

νŠΈλžœμž­μ…˜μ€ 4가지λ₯Ό 보μž₯ν•΄μ•Όν•˜λŠ”λ° 이λ₯Ό μ€„μ—¬μ„œ ACID라함

  • μ›μžμ„±(Atomicity) : νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ‹€ν–‰ν•œ μž‘μ—…λ“€μ€ 마치 ν•˜λ‚˜μ˜ μž‘μ—…μΈ κ²ƒμ²˜λŸΌ λͺ¨λ‘ 성곡 ν•˜κ±°λ‚˜ λͺ¨λ‘ μ‹€νŒ¨ν•΄μ•Όν•œλ‹€.
  • 일관성(Consistency) : λͺ¨λ“  νŠΈλžœμž­μ…˜μ€ 일관성 μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ •ν•œ 무결성 μ œμ•½ 쑰건을 항상 λ§Œμ‘±ν•΄μ•Ό ν•œλ‹€.
  • 격리성(Isolation) : λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” νŠΈλžœμž­μ…˜λ“€μ΄ μ„œλ‘œμ—κ²Œ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ κ²©λ¦¬ν•œλ‹€. 격리성은 λ™μ‹œμ„±κ³Ό κ΄€λ ¨λœ μ„±λŠ₯ 이슈둜 인해 νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€(Isolation level)을 선택할 수 μžˆλ‹€.
  • 지속성(Durability) : νŠΈλžœμž­μ…˜μ„ μ„±κ³΅μ μœΌλ‘œ 끝내면 κ·Έ κ²°κ³Όκ°€ 항상 κΈ°λ‘λ˜μ–΄μ•Ό ν•œλ‹€. 쀑간에 μ‹œμŠ€ν…œμ— λ¬Έμ œκ°€ λ°œμƒν•΄λ„ λ°μ΄ν„°λ² μ΄μŠ€ 둜그 등을 μ‚¬μš©ν•΄μ„œ μ„±κ³΅ν•œ νŠΈλžœμž­μ…˜ λ‚΄μš©μ„ 볡ꡬ해야 ν•œλ‹€.

μ—¬κΈ°μ„œ νŠΈλžœμž­μ…˜ Isolation에 λŒ€ν•΄ λ‹€μ‹œ ν•œ 번 더 μ‚΄νŽ΄λ³΄μž
격리 μˆ˜μ€€μ€

  • READ UNCOMMITED
    λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μ»€λ°‹λ˜μ§€ μ•Šμ€ λ‚΄μš©λ„ μ°Έμ‘°ν•  수 μžˆλ‹€
  • READ COMMITED
    λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μ»€λ°‹λœ λ‚΄μš©λ§Œ μ°Έμ‘°ν•  수 μžˆλ‹€
  • REPEATABLE READ
    νŠΈλžœμž­μ…˜μ— μ§„μž…ν•˜κΈ° 이전에 μ»€λ°‹λœ λ‚΄μš©λ§Œ μ°Έμ‘°ν•  수 μžˆλ‹€
  • SERIALIZABLE
    νŠΈλžœμž­μ…˜μ— μ§„μž…ν•˜λ©΄ 락을 κ±Έμ–΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ²Œ ν•œλ‹€.

(μ˜ν•œμŒ€ ν”Όμ…œλ‘œ 보톡 μ‹€λ¬΄μ—μ„œ READ COMMITED, REPEATABLE READ 이 두 격리 μˆ˜μ€€μœΌλ‘œ 섀정함)

πŸŒŒμŠ€ν”„λ§μ—μ„œ νŠΈλžœμž­μ…˜μ²˜λ¦¬

  • νŠΈλžœμž­μ…˜ λ§€λ‹ˆμ €μ˜ λ™μž‘νλ¦„
    1. μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ transactionManager.getTransaction()을 ν˜ΈμΆœν•΄μ„œ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘
    2. νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•˜λ €λ©΄ λ¨Όμ € λ°μ΄ν„°λ©”μ΄μŠ€ μ»€ν…μ…˜μ΄ ν•„μš”. νŠΈλžœμž­μ…˜ λ§€λ‹ˆμ €λŠ” λ‚΄λΆ€μ—μ„œ λ°μ΄ν„°μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•΄μ„œ 컀λ„₯μ…˜μ„ 생성
    3. 컀λ„₯μ…˜μ„ μˆ˜λ™ 컀밋 λͺ¨λ“œλ‘œ λ³€κ²½ν•΄μ„œ μ‹€μ œ λ°μ΄ν„°λ² μ΄μŠ€ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘
    4. 컀λ„₯μ…˜μ„ νŠΈλžœμž­μ…˜ 동기화 λ§€λ‹ˆμ €μ— 보관
    5. νŠΈλžœμž­μ…˜ 동기화 λ§€λ‹ˆμ €λŠ” μ“°λ ˆλ“œ λ‘œμ»¬μ— 컀λ„₯μ…˜μ„ 보관 λ”°λΌμ„œ λ©€ν‹° μ“°λ ˆλ“œ ν™˜κ²½μ— μ•ˆμ „ν•˜κ²Œ 컀λ„₯μ…˜μ„ 보관할 수 있음
    6. μ„œλΉ„μŠ€λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ‹€ν–‰ν•˜λ©΄μ„œ λ¦¬ν¬μ§€ν† λ¦¬μ˜ λ©”μ„œλ“œλ“€μ„ 호좜. 이 λ•Œ 컀λ„₯μ…˜μ„ νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬ν•˜μ§€ μ•ŠμŒ
    7. 리포지토리 λ©”μ„œλ“œλ“€μ€ νŠΈλžœμž­μ…˜μ΄ μ‹œμž‘λ  컀λ„₯μ…˜μ΄ ν•„μš”. λ¦¬ν¬μ§€ν† λ¦¬λŠ” DataSourceUtils.getConnection()을 μ‚¬μš©ν•΄μ„œ νŠΈλžœμž­μ…˜ λ™κΈ°ν™”λ§€λ‹ˆμ €μ— λ³΄κ΄€λœ 컀λ„₯μ…˜μ„ κΊΌλ‚΄μ„œ μ‚¬μš©. 이 과정을 ν†΅ν•΄μ„œ μžμ—°μŠ€λŸ½κ²Œ 같은 컀λ„₯μ…˜μ„ μ‚¬μš©ν•˜κ³ , νŠΈλžœμž­μ…˜λ„ μœ μ§€
    8. νšλ“ν•œ 컀λ„₯μ…˜μ„ μ‚¬μš©ν•΄μ„œ SQL을 λ°μ΄ν„°λ² μ΄μŠ€μ— μ „λ‹¬ν•΄μ„œ μ‹€ν–‰
    9. λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 λλ‚˜κ³  νŠΈλžœμž­μ…˜μ„ μ’…λ£Œ. νŠΈλžœμž­μ…˜μ€ μ»€λ°‹ν•˜κ±°λ‚˜ λ‘€λ°±ν•˜λ©΄ μ’…λ£Œ
    10. νŠΈλžœμž­μ…˜μ„ μ’…λ£Œν•˜λ €λ©΄ λ™κΈ°ν™”λœ 컀λ„₯μ…˜μ΄ ν•„μš”. νŠΈλžœμž­μ…˜ 동기화 λ§€λ‹ˆμ €λ₯Ό 톡해 λ™κΈ°ν™”λœ 컀λ„₯μ…˜μ„ νšλ“
    11. νšλ“ν•œ 컀λ„₯μ…˜μ„ 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ— νŠΈλžœμž­μ…˜μ„ μ»€λ°‹ν•˜κ±°λ‚˜ λ‘€λ°±
    12. 전체 λ¦¬μ†ŒμŠ€ 정리
  • @Transactional μ‚¬μš©
    λ‚΄ μ„œλΉ„μŠ€ λ‘œμ§μ— @Transactional을 뢙이면 νŠΈλžœμž­μ…˜μ΄ κ΅¬ν˜„λœ ν”„λ‘μ‹œ 객체λ₯Ό λ§Œλ“€μ–΄ μ†μ‰½κ²Œ νŠΈλžœμž­μ…˜ κ΅¬ν˜„ κ°€λŠ₯

μ°Έκ³ 
κΉ€μ˜ν•œμ˜ μŠ€ν”„λ§ DB 1편 - 데이터 μ ‘κ·Ό 핡심 원리

profile
였직 λ‚˜λ§Œμ„ μœ„ν•œ κΈ€. ν‹€λ¦° λΆ€λΆ„ 말씀해 μ£Όμ‹œλ©΄ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

0개의 λŒ“κΈ€