Skip to content

Latest commit

Β 

History

History
56 lines (32 loc) Β· 3.22 KB

Transaction.md

File metadata and controls

56 lines (32 loc) Β· 3.22 KB

Transaction

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

νŠΈλžœμž­μ…˜μ΄λž€, λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ°”κΎΈλŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μž‘μ—…μ˜ λ‹¨μœ„ 이닀. λͺ¨λ“  λͺ…λ Ήμ–΄μ˜ 성곡 λ˜λŠ” μ‹€νŒ¨λ₯Ό ν•œ λ²ˆμ— μ²˜λ¦¬ν•˜λŠ”λ°, 이 κΈ°λŠ₯이 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λ €λ©΄ 성곡 λ˜λŠ” μ‹€νŒ¨κ°€ ν•œ λ²ˆμ— μΌμ–΄λ‚˜μ•Όν•œλ‹€.

νŠΈλžœμž­μ…˜ μ²˜λ¦¬κ°€ ν•„μš”ν•œ 이유

μ² μˆ˜κ°€ μ˜ν¬μ—κ²Œ 1000원을 μ†‘κΈˆν•˜λŠ” 상황은 μ•„λž˜μ™€ 같이 μš”μ•½ν•  수 μžˆλ‹€.

  • 철수의 κ³„μ’Œμ—μ„œ 1000원 좜금
  • 영희의 κ³„μ’Œμ— 1000원 μž…κΈˆ

그런데 λ§Œμ•½ 철수의 κ³„μ’Œμ—μ„œ 좜금이 μ„±κ³΅ν–ˆμ§€λ§Œ 영희의 κ³„μ’Œμ— μž…κΈˆν•˜λŠ” 도쀑 였λ₯˜κ°€ λ°œμƒν•˜λ©΄, 철수의 κ³„μ’Œμ—μ„œλŠ” 이미 μ²œμ›μ΄ μ€„μ—ˆμœΌλ‚˜ μ˜ν¬λŠ” 받은 돈이 μ—†λŠ” 상황이 λœλ‹€.

μ΄λŸ¬ν•œ 상황이 λ°œμƒν•˜λ©΄ μ•ˆλ˜λ―€λ‘œ, 두 가지 κΈ°λŠ₯은 ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ 관리해야 ν•œλ‹€. ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ κ΄€λ¦¬ν•˜λ©΄ 영희의 κ³„μ’Œμ— μž…κΈˆν•˜λŠ” κΈ°λŠ₯이 μ‹€νŒ¨ν–ˆμ„ 경우, 철수의 κ³„μ’Œμ— 돈이 λ‹€μ‹œ μž…κΈˆν•΄μ•Ό ν•œλ‹€. μ΄λŸ¬ν•œ κΈ°λŠ₯이 RollBack이닀.

νŠΈλžœμž­μ…˜ μ„±μ§ˆ

  • μ›μžμ„±(Atomicity) : ν•œ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ‹€ν–‰ν•œ μž‘μ—…λ“€μ€ ν•˜λ‚˜λ‘œ 간주함. 즉, λͺ¨λ‘ 성곡 ν˜Ήμ€ μ‹€νŒ¨
  • 일관성(Consistency) : νŠΈλžœμž­μ…˜μ€ 일관성 μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλ₯Ό μœ μ§€ν•œλ‹€.
  • 격리성(Isolation) : λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” νŠΈλžœμž­μ…˜λ“€μ΄ μ„œλ‘œ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ κ²©λ¦¬ν•΄μ•Όν•œλ‹€.
  • 지속성(Durability) : νŠΈλžœμž­μ…˜μ„ μ„±κ³΅μ μœΌλ‘œ 마치면 κ²°κ³Όκ°€ 항상 μ €μž₯λ˜μ–΄μ•Όν•œλ‹€.

μ—¬λŸ¬κ°œμ˜ νŠΈλžœμž­μ…˜μ΄ κ²½μŸν•œλ‹€λ©΄?

νŠΉμ • νŠΈλžœμž­μ…˜μ΄ μˆ˜μ • ν›„ 아직 μ»€λ°‹ν•˜μ§€ μ•Šμ•˜λŠ”λ° λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ κ·Έ λ ˆμ½”λ“œμ— μ ‘κ·Όν•  수 μžˆλ‹€.

μ΄λŸ¬ν•œ 경쟁 μƒν™©μ—μ„œ λ°œμƒν•  수 μžˆλŠ” λ¬Έμ œλŠ” 크게 μ„Έ 가지이고, 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€(Transaction Isolation Level)이 μ •μ˜λ˜μ–΄μžˆλ‹€.

1. Dirty Read

μˆ˜μ •μ€‘μΈ 데이터에 접근을 ν—ˆμš©ν•  경우 λ°œμƒν•˜λŠ” 데이터 λΆˆμΌμΉ˜μ΄λ‹€.

2. Non-Repeatable Read

ν•œ νŠΈλžœμž­μ…˜μ—μ„œ 같은 쿼리λ₯Ό 두 번 μ‹€ν–‰ν–ˆμ„ λ•Œ λ°œμƒν•˜λŠ” 데이터 λΆˆμΌμΉ˜μ΄λ‹€.

3. Phantom Read

ν•œ νŠΈλžœμž­μ…˜μ—μ„œ 일정 λ²”μœ„μ˜ λ ˆμ½”λ“œλ₯Ό 두 번 이상 읽을 λ•Œ λ°œμƒν•˜λŠ” 데이터 λΆˆμΌμΉ˜μ΄λ‹€.

νŠΈλžœμž­μ…˜ κ²©λ¦¬μˆ˜μ€€

읽어보기..


μ™œ @Transactional을 쓰지 μ•Šμ•˜μ„ λ•Œ μ—λŸ¬κ°€ λ‚¬μ„κΉŒ (κ·Έλƒ₯ λ‚˜μ˜ 생각...λ­”κ°€ μΈν„°λ„·μ˜ 레퍼런슀λ₯Ό 봐도 ꢁ금증이 ν•΄κ²°λ˜μ§€ μ•Šμ•„μ„œ. μ •λ‹΅ 아닐 μˆ˜λ„ 있음🀫)

  • νŠΈλžœμž­μ…˜μ€ λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλ₯Ό λ³€κ²½μ‹œν‚€λŠ” μž‘μ—… λ˜λŠ” ν•œ λ²ˆμ— μˆ˜ν–‰λ˜μ–΄μ•Όν•˜λŠ” 연산듀을 μ˜λ―Έν•œλ‹€.
  • DB에 μ €μž₯된 객체의 값을 μ‚¬μš©ν•˜κ³ μž ν–ˆλŠ”λ°, 아직 λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœμ˜ λ³€ν™”κ°€ λλ‚˜μ§€ μ•Šμ•˜κ³ (λ“€μ–΄μ˜¬ 값이 더 μžˆμ—ˆμŒ) λ”°λΌμ„œ νŠΈλžœμž­μ…˜μ„ μ„€μ •ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ ν•΄λ‹Ή 객체의 ν•„λ“œκ°€ nullμ΄μ—ˆλ‹€.
  • ν•˜μ§€λ§Œ @Transactional을 μ μš©ν•˜λ©΄, λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœκ°€ μ™„μ „νžˆ λ³€ν™”λœ μ‹œμ μ—μ„œ 컀밋을 ν•˜κ³  μ €μž₯을 ν•œλ‹€.

좜처

https://preamtree.tistory.com/154