λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Study/Java

[TIL] νŠΈλžœμž­μ…˜

by hong- 2022. 7. 12.

πŸ™πŸ» νŠΈλžœμž­μ…˜ Transaction

 - μ—¬λŸ¬ 개의 μž‘μ—…λ“€μ„ ν•˜λ‚˜μ˜ 그룹으둜 λ¬Άμ–΄μ„œ μ²˜λ¦¬ν•˜λŠ” 처리 λ‹¨μœ„

 - λ¬Όλ¦¬μ μœΌλ‘œλŠ” μ—¬λŸ¬ 개의 μž‘μ—…

    λ…Όλ¦¬μ μœΌλ‘œλŠ” ν•˜λ‚˜μ˜ μž‘μ—…μœΌλ‘œ μΈμ‹ν•˜μ—¬ μ „λΆ€ 성곡 or μ‹€νŒ¨λ‘œ μ²˜λ¦¬λ˜μ–΄μ•Ό 함 ( All or Nothing )

   → λ°μ΄ν„°μ˜ 무결성 보μž₯


πŸ“ νŠΈλžœμž­μ…˜ νŠΉμ§• : ACID 원칙

 β‘  Atomicity : μ›μžμ„±

 - μž‘μ—…μ„ 더 이상 μͺΌκ°€ 수 μ—†μŒ

 - λ…Όλ¦¬μ μœΌλ‘œ ν•˜λ‚˜μ˜ μž‘μ—…μœΌλ‘œ μΈμ‹λ˜λ©΄ μ–΄λ–€ μž‘μ—…μ€ μ²˜λ¦¬ν•˜κ³  μ–΄λ–€ μž‘μ—…μ€ 처리 ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” μ‹μœΌλ‘œ μͺΌκ°œμ„œ 처리 X

   → λ‘˜ λ‹€ μ„±κ³΅ν•˜κ±°λ‚˜ μ‹€νŒ¨ν•˜λŠ” λ“±μ˜ ν•˜λ‚˜λ‘œλ§Œ μ²˜λ¦¬κ°€ 보μž₯λ˜μ–΄μ•Ό 함

 - ex) 음료 주문을 ν•˜λ©΄ 음료 수 만큼 μŠ€νƒ¬ν”„ νšŸμˆ˜κ°€ μ¦κ°€λ˜λŠ” μž‘μ—…μ΄ μžˆμ„ λ•Œ

          음료 μ£Όλ¬Έκ³Ό μŠ€νƒ¬ν”„ μ¦κ°€λŠ” λ‘˜ λ‹€ μ„±κ³΅ν•˜κ±°λ‚˜ λ‘˜ λ‹€ μ‹€νŒ¨λ‘œ 처리 λ˜μ–΄μ•Ό 함 (음료 주문만 λ˜κ±°λ‚˜ μŠ€νƒ¬ν”„ μ¦κ°€λ§Œ 되면 x)

 β‘‘ Consistency : 일관성

 - νŠΈλžœμž­μ…˜μ΄ μ—λŸ¬ 없이 μ„±κ³΅μ μœΌλ‘œ μ’…λ£Œλ  경우 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ μ˜λ„ν•˜λŠ” λŒ€λ‘œ 일관성 있게 μ €μž₯λ˜κ±°λ‚˜ 변경됨

 - ex) λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 맞게 μ£Όλ¬Έ ν•œ 컀피 수 만큼 μŠ€νƒ¬ν”„ νšŸμˆ˜κ°€ 증가함

 β‘’ Isolation : 격리성

 - μ—¬λŸ¬ 개의 νŠΈλžœμž­μ…˜μ΄ 싀행될 경우 각각 λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜μ–΄μ•Ό 함

 - CPUκ°€ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ²˜λ¦¬ν•˜λŠ” 과정을 μ΄ν•΄ν•˜κ³  μžˆμ–΄μ•Ό 함

 - μ»΄ν“¨ν„°λ‘œ 인터넷 쇼핑을 ν•˜λ©΄μ„œ λ™μ‹œμ— μŒμ•…μ„ λ“£κ³  μžˆλ”°λ©΄ λˆˆμ—λŠ” 보이지 μ•Šμ§€λ§Œ CPUκ°€ 두 개의 ν”„λ‘œμ„ΈμŠ€λ₯Ό λ²ˆκ±Έμ•„κ°€λ©° μ‹€ν–‰

 - DB도 μ„±λŠ₯ ν–₯상을 λͺ©μ μœΌλ‘œ ν•œ 개 μ΄μƒμ˜ νŠΈλžœμž­μ…˜μ„ λ²ˆκ°ˆμ•„κ°€λ©° μ²˜λ¦¬ν•¨

 β‘£ Durability : 지속성

 - νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ˜λ©΄ κ·Έ κ²°κ³Όκ°€ μ§€μ†λ˜μ–΄μ•Ό 함

 - λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ’…λ£Œλ˜μ–΄λ„ λ°μ΄ν„°λŠ” 물리적인 μž₯μ†Œμ— μ €μž₯λ˜μ–΄ μ§€μ†μ μœΌλ‘œ μœ μ§€λ˜μ–΄μ•Ό 함


πŸ“ νŠΈλžœμž­μ…˜ 컀밋 Commit / λ‘€λ°± Rollback

 β–ͺ️ 컀밋 : Commit

  - λͺ¨λ“  μž‘μ—…μ„ μ΅œμ’…μ μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•˜λŠ” λͺ…λ Ήμ–΄

  - 컀밋 λͺ…령을 μˆ˜ν–‰ν•˜λ©΄ λ³€κ²½λœ λ‚΄μš©μ΄ λ°μ΄ν„°λ² μ΄μŠ€μ— 영ꡬ적으둜 μ €μž₯되고 νŠΈλžœμž­μ…˜μ΄ μ’…λ£Œλ¨

  - 컀밋 λͺ…령을 μˆ˜ν–‰ν•˜μ§€ μ•ŠμœΌλ©΄ μž‘μ—…μ˜ κ²°κ³Όκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ— μ΅œμ’…μ μœΌλ‘œ λ°˜μ˜λ˜μ§€ μ•ŠμŒ

 β–ͺ️ λ‘€λ°± : Rollback

  - μž‘μ—… 쀑 λ¬Έμ œκ°€ λ°œμƒν–ˆμ„ λ•Œ νŠΈλžœμž­μ…˜ λ‚΄ μˆ˜ν–‰λœ μž‘μ—…λ“€μ„ μ·¨μ†Œν•¨

  - νŠΈλžœμž­μ…˜ μ‹œμž‘ μ΄μ „μ˜ μƒνƒœλ‘œ λ˜λŒμ•„κ°


πŸ“ μ„ μ–Έν˜• νŠΈλžœμž­μ…˜

  β–ͺ️ μ• λ„ˆν…Œμ΄μ…˜ λ°©μ‹μ˜ νŠΈλžœμž­μ…˜ 적용

  - μž‘μ„±ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— μ• λ„ˆν…Œμ΄μ…˜ μΆ”κ°€

  - @Transactional μ΄λΌλŠ” μ• λ„ˆν…Œμ΄μ…˜μ„ νŠΈλžœμž­μ…˜μ΄ ν•„μš”ν•œ μ˜μ—­μ— μΆ”κ°€

@Service
@Transactional
public class MemberService { 
   ...
    ..
     .
 }

 → 클래슀 λ ˆλ²¨μ— μ• λ„ˆν…Œμ΄μ…˜ μΆ”κ°€ : ν•΄λ‹Ή ν΄λž˜μŠ€μ—μ„œ MemberRepository의 κΈ°λŠ₯을 μ΄μš©ν•˜λŠ” λͺ¨λ“  λ©”μ„œλ“œμ— νŠΈλžœμž­μ…˜ 적용


 πŸ’‘ 체크 μ˜ˆμ™Έ : checked exception

   - @Transactional만 μΆ”κ°€ν•΄μ„œ rollback이 λ˜μ§€ μ•ŠμœΌλ©° ν•΄λ‹Ή μ²΄ν¬μ˜ˆμ™Έλ₯Ό μ§μ ‘ν•΄μ£Όκ±°λ‚˜ 언체크 μ˜ˆμ™Έλ‘œ 감싸 Rollback κΈ°λŠ₯ 적용

   - 직접 μ§€μ • : @Transactional(rollbackFor={SQLException.class}) λ“±


 πŸ’‘ νŠΈλžœμž­μ…˜ μ „νŒŒ : Transaction Propagation

   - νŠΈλžœμž­μ…˜μ˜ κ²½κ³„μ—μ„œ μ§„ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ 쑴재 / μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ μ–΄λ–»κ²Œ λ™μž‘ν• μ§€ κ²°μ •ν•˜λŠ” 방식

   - propagation μ• νŠΈλ¦¬λ·°νŠΈλ₯Ό ν†΅ν•΄μ„œ μ„€μ •ν•  수 있음

   β‘  Propagation.REQUIRED

    - μ§„ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ μ—†μœΌλ©΄ μƒˆλ‘œ μ‹œμž‘ν•˜κ³  μ§„ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ 있으면 ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ— μ°Έμ—¬

    - OrderServiceμ—μ„œ createOrder( )λ₯Ό ν˜ΈμΆœν•˜λ©΄ νŠΈλžœμž­μ…˜ ν•˜λ‚˜ μƒμ„±λ˜λ©° createOrder( ) λ‚΄μ—μ„œ

       updateMember( )κ°€ 호좜되면 updateMember에 @Transactional(propagation=Propagation.REQUIRED)κ°€

       μ§€μ •λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— ν˜„μž¬ OrderServiceμ—μ„œ μ§„ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ— μ°Έμ—¬ν•˜κ²Œ 됨 

   β‘‘ Propagation.REQUIRES_NEW

    - 이미 진행쀑인 νŠΈλžœμž­μ…˜κ³Ό λ¬΄κ΄€ν•˜κ²Œ μƒˆλ‘œμš΄ νŠΈλžœμž­μ…˜ μ‹œμž‘

    - 기쑴에 μ§„ν–‰μ€‘μ΄λ˜ νŠΈλžœμž­μ…˜μ€ μƒˆλ‘œ μ‹œμž‘λœ νŠΈλžœμž­μ…˜μ΄ μ’…λ£Œλ  λ•Œ κΉŒμ§€ 쀑지됨

   β‘’ Propagation.MANDATORY

    - μ§„ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ μ—†μœΌλ©΄ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΄

   β‘£ Propagation.*NOT_SUPPORTED*

   - νŠΈλžœμž­μ…˜μ΄ ν•„μš”λ‘œ ν•˜μ§€ μ•ŠμŒμ„ μ˜λ―Έν•¨

   - μ§„ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ 있으면 λ©”μ„œλ“œ 싀행이 μ’…λ£Œλ  λ•ŒκΉŒμ§€ 진행쀑인 νŠΈλžœμž­μ…˜μ€ μ€‘μ§€λ˜λ©° 

      λ©”μ„œλ“œ 싀행이 μ’…λ£Œλ˜λ©΄ νŠΈλžœμž­μ…˜μ„ 계속 진행함

   β‘€ Propagation.*NEVER*

   - νŠΈλžœμž­μ…˜μ΄ ν•„μš”λ‘œ ν•˜μ§€ μ•ŠμŒμ„ 의미

   - μ§„ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ μ‘΄μž¬ν•  κ²½μš°μ—λŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΄


 πŸ’‘ νŠΈλžœμž­μ…˜ 격리 레벨 : Isolation Level

   - ACID 원칙을 보며 νŠΈλžœμž­μ…˜μ€ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ— 영ν–₯을 μ£Όμ§€ μ•Šκ³  λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” 격리성 보μž₯ ν•„μš”

   - Spring은 μ΄λŸ¬ν•œ 격리성을 μ‘°μ •ν•  수 μžˆλŠ” μ˜΅μ…˜μ„ @Transactional의 isolation μ• νŠΈλ¦¬λ·°νŠΈλ₯Ό 톡해 제곡

   β‘  Isolation.DEFAULT

    - λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ κ°’

   β‘‘ Isolation.READ_UNCOMMITTED

    - λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μ»€λ°‹ν•˜μ§€ μ•Šμ€ 데이터λ₯Ό μ½λŠ” 것을 ν—ˆμš©ν•¨

   β‘’ Isoloation.READ_COMITTED

    - λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ— μ˜ν•΄ μ»€λ°‹λœ 데이터λ₯Ό μ½λŠ” 것을 ν—ˆμš©

   β‘£ Isolation.REPEATABLE_READ

    - νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ ν•œ 번 μ‘°νšŒν•œ 데이터λ₯Ό λ°˜λ³΅ν•΄μ„œ μ‘°νšŒν•΄λ„ 같은 데이터가 μ‘°νšŒλ˜λ„λ‘ 함

   β‘€ Isolation.SERIALIZABLE

    - λ™μΌν•œ 데이터에 λŒ€ν•΄μ„œ λ™μ‹œμ— 두 개 μ΄μƒμ˜ νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰λ˜μ§€ λͺ»ν•˜λ„둝 함


 β–ͺ️  AOP λ°©μ‹μ˜ νŠΈλžœμž­μ…˜ 적용

  - AOP 방식을 μ΄μš©ν•˜μ—¬ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ νŠΈλžœμž­μ…˜ 적용 μ½”λ“œ 감좔기


πŸ“ λΆ„μ‚° νŠΈλžœμž­μ…˜

  - μ„œλ‘œ λ‹€λ₯Έ 데이터 μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” ν•œ 개 μ΄μƒμ˜ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬Άμ–΄μ„œ 처리

 

'Study > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[TIL] 슬라이슀 ν…ŒμŠ€νŠΈ  (0) 2022.07.14
[TIL] λ‹¨μœ„ν…ŒμŠ€νŠΈ  (0) 2022.07.12
[TIL] Spring Data JPA  (0) 2022.07.12
[TIL] JPA λ§€ν•‘  (0) 2022.07.05
[TIL] JPA  (0) 2022.07.05