Skip to content

Latest commit

Β 

History

History
94 lines (67 loc) Β· 5.13 KB

File metadata and controls

94 lines (67 loc) Β· 5.13 KB

Spring Transactional

Isolation

Transaction의 일관성을 λ‚˜νƒ€λ‚΄λŠ” 격리 μˆ˜μ€€μ„ λͺ…μ‹œν•œλ‹€. μžμ„Έν•¨ 사항은 Transaction Isolation Level μ°Έμ‘°

Recommandλ˜λŠ” λ°©μ‹μœΌλ‘œλŠ” Readμ‹œμ—λŠ” REPEATABLE READ, Create, Update, Delete λ•ŒλŠ” SERIALIZABLE

DEFAULT

κΈ°λ³Έ κ²©λ¦¬μˆ˜μ€€μœΌλ‘œ DB의 κΈ°λ³Έ Isolcation Level을 따라감

READ_UNCOMMITTED (Level 0)

  • μ»€λ°‹λ˜μ§€ μ•ŠλŠ” 데이터에 λŒ€ν•œ 읽기λ₯Ό ν—ˆμš©
  • Dirty Read λ°œμƒ

READ_COMMITTED (level 1)

  • μ»€λ°‹λœ λ°μ΄ν„°λ§Œ 읽기 ν—ˆμš©
  • Dirty Read λ°©μ§€ν•œλ‹€.
  • ν•˜λ‚˜μ˜ Transaction μ•ˆμ—μ„œ Selectμ‹œλ§ˆλ‹€ 값이 λ‹€λ₯Όμˆ˜κ°€ μžˆλŠ” Non-Repeatable Read 문제 λ°œμƒ

REPEATABLE_READ (level 2)

  • νŠΈλžœμ μ…˜μ΄ μ™„λ£Œλ λ–„κΉŒμ§€ selectμ—μ„œ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  데이터에 shared lock이 κ±Έλ¦Ό (λ‹€λ₯Έκ³³μ—μ„œ μˆ˜μ • λΆˆκ°€λŠ₯)
  • νŠΈλžœμ μ…˜ λ‚΄λΆ€μ—μ„œ μΌκ΄€μ„±μžˆλŠ” 데이터 보증
  • Non-Repeatable Read λ°©μ§€

SERIALIZABLE (level 3)

  • λ°μ΄ν„°μ˜ 일관성 및 λ™μ‹œμ„±μ„ μœ„ν•΄ MVCC(Multi Version Concurrency Control) μ‚¬μš©ν•˜μ§€ μ•ŠμŒ
  • νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ SELECT λ¬Έμž₯이 μ‚¬μš©ν•˜λŠ” λͺ¨λ“  데이터에 shared lock이 κ±Έλ¦¬λ―€λ‘œ λ‹€λ₯Έ μ‚¬μš©μžλŠ” κ·Έ μ˜μ—­μ— ν•΄λ‹Ήλ˜λŠ” 데이터에 λŒ€ν•œ μˆ˜μ • 및 μž…λ ₯이 λΆˆκ°€λŠ₯ν•˜λ‹€.
  • Phantom Read λ°©μ§€

Propagation

νŠΈλžœμž­μ…˜ λ™μž‘ 도쀑 λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ„ 호좜(μ‹€ν–‰)ν•˜λŠ” 상황에 선택할 수 μžˆλŠ” μ˜΅μ…˜ @Transactional의 propagation 속성을 톡해 ν”Όν˜ΈμΆœ νŠΈλžœμž­μ…˜μ˜ μž…μž₯μ—μ„œλŠ” ν˜ΈμΆœν•œ μͺ½μ˜ νŠΈλžœμž­μ…˜μ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  μˆ˜λ„ 있고, μƒˆλ‘­κ²Œ νŠΈλžœμž­μ…˜μ„ 생성할 μˆ˜λ„ μžˆλ‹€.

REQUIRED

Default μ†μ„±μœΌλ‘œ λΆ€λͺ¨ νŠΈλž™μ μ…˜μ΄ μžˆλŠ” 경우 μ°Έμ—¬ν•˜κ³  μ—†λŠ”κ²½μš°μ—λŠ” μƒˆλ‘œμš΄ νŠΈλžœμ μ…˜μ„ μƒμ„±ν•œλ‹€. 보톡 이 μ„€μ •μœΌ λŒ€λΆ€λΆ„ λ¬Έμ œλŠ” ν•΄κ²°λœλ‹€.

SUPPORTS

이미 μ‹œμž‘λœ νŠΈλžœμž­μ…˜μ΄ 있으면 μ°Έμ—¬ν•˜κ³  κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ νŠΈλžœμž­μ…˜ 없이 μ§„ν–‰ νŠΈλžœμ μ…˜μ΄ 없어도 νŠΈλžœμ μ…˜μ˜ κ²½κ³„μ—μ„œ Connectionμ΄λ‚˜ ν•˜μ΄λ²„λ„€μ΄νŠΈμ˜ Session을 κ³΅μœ ν•  수 μžˆλ‹€.

MANDATORY

REQUIRED와 λΉ„μŠ·ν•˜κ²Œ 이미 μ‹œμž‘λœ νŠΈλžœμž­μ…˜μ΄ 있으면 μ°Έμ—¬ν•œλ‹€. λ°˜λ©΄μ— νŠΈλžœμž­μ…˜μ΄ μ‹œμž‘λœ 것이 μ—†μœΌλ©΄ μƒˆλ‘œ μ‹œμž‘ν•˜λŠ” λŒ€μ‹  μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€. ν˜Όμžμ„œλŠ” λ…λ¦½μ μœΌλ‘œ νŠΈλžœμž­μ…˜μ„ μ§„ν–‰ν•˜λ©΄ μ•ˆ λ˜λŠ” κ²½μš°μ— μ‚¬μš©

REQUIRES_NEW

λΆ€λͺ¨μ˜ νŠΈλžœμ μ…˜μ— 상관없이 항상 μƒˆλ‘œμš΄ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•œλ‹€. 이미 μ§„ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ 있으면 νŠΈλžœμž­μ…˜μ„ μž μ‹œ 보λ₯˜μ‹œν‚¨λ‹€.

NOT_SUPPORTED

νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ²Œ ν•œλ‹€. 이미 μ§„ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ 있으면 보λ₯˜μ‹œν‚¨λ‹€.

NEVER

νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ κ°•μ œν•œλ‹€. 이미 μ§„ν–‰ 쀑인 νŠΈλžœμž­μ…˜λ„ μ‘΄μž¬ν•˜λ©΄ μ•ˆλœλ‹€ μžˆλ‹€λ©΄ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

NESTED

이미 진행쀑인 νŠΈλžœμž­μ…˜μ΄ 있으면 쀑첩 νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•œλ‹€. 쀑첩 νŠΈλžœμž­μ…˜μ€ νŠΈλžœμž­μ…˜ μ•ˆμ— λ‹€μ‹œ νŠΈλžœμž­μ…˜μ„ λ§Œλ“œλŠ” 것이닀. ν•˜μ§€λ§Œ 독립적인 νŠΈλžœμž­μ…˜μ„ λ§Œλ“œλŠ” REQUIRES_NEWμ™€λŠ” λ‹€λ₯΄λ‹€. μ€‘μ²©λœ νŠΈλžœμž­μ…˜μ€ λ¨Όμ € μ‹œμž‘λœ λΆ€λͺ¨ νŠΈλžœμž­μ…˜μ˜ 컀밋과 λ‘€λ°±μ—λŠ” 영ν–₯을 λ°›μ§€λ§Œ μžμ‹ μ˜ 컀밋과 둀백은 λΆ€λͺ¨ νŠΈλžœμ μ…˜μ—κ²Œ 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€.

ν•΄λ‹Ή μž‘μ—…μ€ λ‘œκ·Έμ— λŒ€ν•œ 정보λ₯Ό μŒ“μ„λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. 메인 νŠΈλžœμ μ…˜μ΄ λλ‚˜κΈ°μ „μ— 둜그λ₯Ό κΌ­ DB에 μ €μž₯ν•˜μ—¬μ•Ό ν• λ•Œ 둜그 DBκ°€ μ €μž₯에 μ‹€νŒ¨ν•˜λ”λΌλ„ λΆ€λͺ¨μ˜ μ›λž˜ νŠΈλžœμ μ…˜μ— 영ν–₯을 μ£Όμ–΄μ„œλŠ” μ•ˆλœλ‹€. ν•˜μ§€λ§Œ 둜그λ₯Ό 남긴 ν›„ λΆ€λͺ¨μ˜ νŠΈλžœμ μ…˜μ΄ μ‹€νŒ¨ν–ˆλ‹€λ©΄ 같이 Rollback λ˜μ–΄μ•Ό ν•˜λŠ” 상황이기에 ν•΄λ‹Ή μž‘μ—…μ—μ„œλŠ” NESTEDκ°€ μ ν•©ν•˜λ‹€.

쀑첩 νŠΈλžœμž­μ…˜μ€ JDBC 3.0 μŠ€νŽ™μ˜ μ €μž₯포인트(savepoint) (ν΄λ¦­μ‹œ μžμ„Έν•œ λ‚΄μš©λ§ν¬) λ₯Ό μ§€μ›ν•˜λŠ” λ“œλΌμ΄λ²„μ™€ DataSourceTransactionManager λ₯Ό μ΄μš©ν•  κ²½μš°μ— 적용 κ°€λŠ₯ν•˜λ‹€.

Read-Only

νŠΈλžœμž­μ…˜μ„ 읽기 μ „μš©μœΌλ‘œ μ„€μ • μ„±λŠ₯을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  μˆ˜λ„ 있고 νŠΉμ • νŠΈλžœμž­μ…˜ μž‘μ—… μ•ˆμ—μ„œ μ“°κΈ° μž‘μ—…μ΄ μΌμ–΄λ‚˜λŠ” 것을 μ˜λ„μ μœΌλ‘œ λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€. 일반적으둜 읽기 μ „μš© νŠΈλžœμž­μ…˜μ΄ μ‹œμž‘λœ 이후 INSERT, UPDATE, DELETE 같은 μ“°κΈ° μž‘μ—…μ΄ μ§„ν–‰λ˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.

ν•˜μ΄λ²„λ„€μ΄νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” FlushModeλ₯Ό Manual둜 λ³€κ²½ν•˜μ—¬ dirty checking을 μƒλž΅

DB에 따라 DataSource의 Connection λ ˆλ²¨μ—λ„ μ„€μ •λ˜μ–΄ μ•½κ°„μ˜ μ΅œμ ν™”κ°€ κ°€λŠ₯

일뢀 νŠΈλžœμž­μ…˜ λ§€λ‹ˆμ €μ˜ 경우 μ½κΈ°μ „μš© 속성을 λ¬΄μ‹œν•˜κ³  μ“°κΈ° μž‘μ—…μ„ ν—ˆμš©ν•  μˆ˜λ„ 있기 λ•Œλ¬Έμ— 주의

Rollback

rollbackFor, noRollbackFor, rollbackForClassName, noRollbackForClassName

νŠΉμ • μ˜ˆμ™Έκ°€ λ°œμƒ μ‹œ κ°•μ œλ‘œ Rollback μ‹œν‚¬μ§€μ˜ μ—¬λΆ€λ₯Ό μ„€μ •ν•¨μœΌλ‘œ μ•žμ— noκ°€ λΆ™μœΌλ©΄ ν•΄λ‹Ή μ˜ˆμ™ΈλŠ” 둀백에 ν¬ν•¨μ‹œν‚€μ§€ μ•ŠλŠ”λ‹€.

Timeout

μ–΄λ…Έν…Œμ΄μ…˜μ— μ§€μ •ν•œ μ‹œκ°„κΉŒμ§€ ν•΄λ‹Ή λ©”μ†Œλ“œ μˆ˜ν–‰μ΄ μ™„λ£Œλ˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” rollback을 μ‹€ν–‰ν•œλ‹€. μ§€μ •λœ 값이 -1일 κ²½μš°μ—λŠ” Timeout μ‹œκ°„μ—†μ΄ λ¬΄ν•œμ • λŒ€κΈ°ν•œλ‹€.