Transaction


πŸ’‘ Transaction μ΄λž€?

β–ͺ DBμ˜μƒνƒœλ₯Ό λ³€ν™”μ‹œν‚€κΈ° μœ„ν•΄μ„œ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ˜ λ‹¨μœ„

β–ͺ 더 이상 μͺΌκ°€ 수 μ—†λŠ” 업무 처리의 μ΅œμ†Œ λ‹¨μœ„

β–ͺ λ©”λͺ¨λ¦¬μ˜ λͺ¨λ“  λ³€ν™”λ₯Ό ν•˜λ‚˜μ˜ μž‘μ—… λ‹¨μœ„λ‘œ λ¬ΆλŠ”λ‹€. ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•˜λ©΄ 전체가 μ‹€νŒ¨

β–ͺ 성곡 ν˜Ήμ€ μ‹€νŒ¨ λ‘κ°œμ˜ 결과만 쑴재.


예λ₯Ό λ“€λ©΄, Aκ°€ Bμ—κ²Œ 10000원을 μ΄μ²΄ν–ˆλ‹€. ν•˜μ§€λ§Œ μ™€μ΄νŒŒμ΄ μ—°κ²°μ˜ 문제둜 이체λ₯Ό μ‹€νŒ¨ν–ˆλ‹€.

이럴 경우 B의 톡μž₯에 10000원이 μ΄μ²΄λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ—, 이체가 μ„±λ¦½λ˜μ§€ μ•ŠλŠ”λ‹€.

이 처럼 Aκ°€ λˆμ„ μ΄μ²΄ν•˜λŠ” ν–‰μœ„μ™€ Bκ°€ λˆμ„ λ°›λŠ” ν–‰μœ„λŠ” λ³„κ°œλ‘œ 뢄리 될 수 μ—†λ‹€.

λ‹€μ‹œλ§ν•΄, μœ„μ™€ 같은 μΌ€μ΄μŠ€λŠ” ν•˜λ‚˜μ˜ κ±°λž˜λ‚΄μ—­μœΌλ‘œ μ²˜λ¦¬λ˜μ–΄μ•Ό ν•˜λŠ” 단일 κ±°λž˜μ΄λ‹€.

이런 거래의 μ΅œμ†Œ λ‹¨μœ„λ₯Ό νŠΈλžœμž­μ…˜ 이라고 ν•œλ‹€. νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œ λ˜μ—ˆμ„ 경우만,

commit을 ν•˜κ³ , λ¬Έμ œκ°€ λ°œν–‰ν–ˆμ„ λ•ŒλŠ” λ‘€λ°±(λ‹€μ‹œ A의 κ³„μ’Œμ— 10000원이 λ“€μ–΄κ°„λ‹€.)을 ν•œλ‹€.



πŸ’‘ Transaction의 μ„±μ§ˆ - ACID

1. Atomicity (μ›μžμ„±)

ν•˜λ‚˜μ˜ νŠΈλ Œμž­μ…˜ λ‚΄μ˜ λͺ¨λ“  λͺ…령은 μ „λΆ€ 성곡해야 ν•œλ‹€. β†’ λΆ€λΆ„μ μœΌλ‘œ μ‹€ν–‰λ˜λ©΄ μ•ˆλ˜λŠ” μ„±μ§ˆ

μ–΄λŠ ν•˜λ‚˜λΌλ„ μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©΄, νŠΈλžœμž­μ…˜μ€ μ‹€νŒ¨ν•œλ‹€.

μœ„μ˜ μ˜ˆμ‹œμ—μ„œλ„ μ•Œ 수 μžˆλ“―μ΄, 이체가 μ‹€νŒ¨ν•˜λ©΄ μ‹€νŒ¨λ‘œ λŒμ•„κ°€μ•Όν•œλ‹€λŠ” 것이 Atomicity이닀.

SQLμ—μ„œλ„ λ§ˆμ°¬κ°€μ§€μ΄λ‹€. νŠΉμ • query(질의문)λ₯Ό μ‹€ν–‰ν•  λ•Œ μ‹€νŒ¨ν•˜λŠ” 뢀뢄이 μžˆλ‹€λ©΄ μ „λΆ€ μ‹€νŒ¨ν•œλ‹€.


2. Consistency (일관성)

νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ 이루어지면, μ–Έμ œλ‚˜ 일관성 μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλ‘œ λ³€ν™˜λ˜μ–΄μ•Ό

ν•œλ‹€. 즉, λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ œμ•½μ΄λ‚˜ κ·œμΉ™μ— μ˜κ±°ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ—¬μ•Ό ν•œλ‹€λŠ” 뜻 이닀.

예λ₯Ό λ“€μ–΄ β€œκ° 고객듀은 이름이 μžˆμ–΄μ•Όν•œλ‹€β€ λΌλŠ” μ œμ•½μ΄ μ›λž˜ DB에 μžˆλ‹€κ³  ν•˜λ©΄,

  • Case 1 : 이름 μ—†λŠ” μƒˆλ‘œμš΄ 고객을 μΆ”κ°€ν•˜λŠ” 쿼리
  • Case 2 : κΈ°μ‘΄ 고객의 이름을 μ‚­μ œν•˜λŠ” 쿼리

μœ„μ˜ νŠΈλžœμž­μ…˜λ“€μ€ β€œκ° 고객듀은 이름이 μžˆμ–΄μ•Όν•œλ‹€β€λΌλŠ” 본래 DB의 μ œμ•½μ„ μœ„λ°°ν•œλ‹€.

이런 νŠΈλžœμž­μ…˜ 이후에 λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλŠ” μΌκ΄€λ˜μ§€ μ•Šμ•„μ§„λ‹€.


Movie와 Video ν…Œμ΄λΈ”μ΄ μžˆμ„ λ•Œ Video ν…Œμ΄λΈ”μ˜ κΈ°λ³Έ ν‚€(primary key)인 movie_idκ°€

μ™Έλž˜ν‚€λ‘œ μ‘΄μž¬ν•œλ‹€κ³  κ°€μ •ν•΄λ΄€λ‹€. λ§Œμ•½ movie_id의 μ œμ•½ 쑰건이 Movie ν…Œμ΄λΈ”μ—μ„œ λ³€κ²½λ˜λ©΄,

Video ν…Œμ΄λΈ”μ—μ„œλ„ movie_idκ°€ λ³€κ²½λ˜μ–΄μ•Ό ν•œλ‹€.


3. Isolation (고립성)

ν•˜λ‚˜μ˜ νŠΈλ Œμž­μ…˜μ΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜κ³Ό λ…λ¦½λ˜μ–΄μ•Ό ν•œλ‹€λŠ” νŠΉμ„±μ΄λ‹€.

즉, νŠΈλžœμž­μ…˜λΌλ¦¬ μ„œλ‘œ κ°„μ„­ν•  수 μ—†λ‹€.

λ˜ν•œ μˆ˜ν–‰μ€‘μΈ νŠΈλžœμž­μ…˜μ΄ μ™„μ „νžˆ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ μˆ˜ν–‰κ²°κ³Όλ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€.

μ‰½κ²Œ 말해 각 νŠΈλžœμž­μ…˜μ€ μ‹œμŠ€ν…œ 내에세 λ™μ‹œμ— μˆ˜ν–‰λ˜κ³  μžˆλŠ” λ‹€λ₯Έ νŠΈλžœμž­μ…˜λ“€μ„ μ•Œ 수 μ—†λ‹€.


예λ₯Ό λ“€μ–΄, λ‚˜μ˜ 톡μž₯ μž”κ³ λŠ” 10000원이닀. 근데 친ꡬA μ—κ²Œ 7000원씩 λ³΄λ‚΄μ€˜μ•Όν•œκ³  ν•΄λ³΄μž.

친ꡬ Aμ—κ²Œ 7000원을 λ³΄λ‚΄λ˜ 도쀑, ꡐ톡비 10000원이 결제 될 수 μžˆμ„κΉŒ? μ ˆλŒ€ λΆˆκ°€ν•˜λ‹€.

이게 κ³ λ¦½μ„±μ˜ 효과인 것 κ°™λ‹€.

μž”κ³ κ°€ 10000원인 톡μž₯μ—μ„œ β€œ7000원 μ†‘κΈˆβ€κ³Ό β€œ10000원 μΆœκΈˆβ€μ€ λ™μ‹œμ— μΌμ–΄λ‚˜μ„  μ•ˆλœλ‹€.

7000원 μ†‘κΈˆμ΄ 이뀄지고 κ΅ν†΅λΉ„λŠ” 미납이 될 것이닀.

μ΄λ ‡κ²Œ 각 ν–‰μœ„λ“€μ€ μ„œλ‘œ κ°„μ„­ν•  수 μ—†κ³ , μ„œλ‘œ μ–΄λ–€ 연산을 ν•˜λŠ”μ§€λ„ μ•Œ 수 μ—†λ‹€.


4. Durability (지속성)

ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λ˜μ—ˆλ‹€λ©΄ ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ— λŒ€ν•œ 둜그(기둝)κ°€ 남고,

β€˜λŸ°νƒ€μž„ 였λ₯˜β€™λ‚˜ β€˜μ‹œμŠ€ν…œ 였λ₯˜β€™κ°€ λ°œμƒν•˜λ”λΌλ„ ν•΄λ‹Ή 기둝은 μ˜κ΅¬μ μ΄μ–΄μ•Ό ν•œλ‹€λŠ” νŠΉμ„±μ΄λ‹€.


예λ₯Ό λ“€μ–΄, μΉœκ΅¬μ—κ²Œ 10000원을 이체 ν–ˆλŠ”λ°, ν•΄λ‹Ή 은행 μ–΄ν”Œμ— 였λ₯˜κ°€ λ°œμƒν•΄ μ–΄ν”Œμ΄ μ’…λ£Œκ°€

됐닀고 κ°€μ •ν•΄λ΄€λ‹€. λ§Œμ•½ β€œνŠΈλžœμž­μ…˜ 둜그(이체내역)”가 남지 μ•ŠλŠ” λ‹€λ©΄ λ‚˜μ˜ 10000원은

μ–΄λ””λ‘œ κ°”λŠ”μ§€ μ ˆλŒ€ μ•Œμˆ˜κ°€ μ—†λ‹€.

이런 λΆˆμƒμ‚¬λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œ λͺ¨λ“  νŠΈλžœμž­μ…˜μ€ 둜그둜 남겨져 μ‹œμŠ€ν…œ μž₯μ•  λ°œμƒ μ „ μƒνƒœλ‘œ

되돌릴 수 μžˆμ–΄μ•Ό ν•œλ‹€. λ˜ν•œ λͺ¨λ“  νŠΈλžœμž­μ…˜μ€ λ‘œκ·Έμ— λͺ¨λ“  것이 μ €μž₯된 ν›„μ—λ§Œ μ •μƒμ μœΌλ‘œ

처리된 β€œcommit μƒνƒœβ€ 둜 고렀될 수 μžˆλ‹€.



πŸ’‘ Transaction μ—°μ‚°

1. Commit

Commit 연산은 λͺ¨λ“  μž‘μ—…λ“€μ„ μ •μƒμ μœΌλ‘œ μ²˜λ¦¬ν•˜κ² λ‹€κ³  ν™•μ •ν•˜λŠ” λͺ…λ Ήμ–΄λ‘œμ„œ, μ²˜λ¦¬κ³Όμ •μ„

DB에 영ꡬ히 μ €μž₯ν•˜λŠ” 것을 λ§ν•œλ‹€. 즉, ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜ 과정을 μ’…λ£Œν•˜λŠ” 것이닀.

그리고 Commit을 μˆ˜ν–‰ν•˜λ©΄ 이전 데이터가 μ™„μ „νžˆ μ—…λ°μ΄νŠΈλœλ‹€.


2. Rollback

μž‘μ—… 쀑 λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ νŠΈλžœμž­μ…˜μ˜ μ²˜λ¦¬κ³Όμ •μ—μ„œ λ°œμƒν•œ 변경사항을 μ·¨μ†Œν•˜λŠ” λͺ…령이닀.

ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ˜ 일뢀가 μ •μƒμ μœΌλ‘œ μ²˜λ¦¬λλ‹€ ν•˜λ”λΌλ„, νŠΈλžœμž­μ…˜μ˜ μ›μžμ„±μ„ κ΅¬ν˜„ν•˜κΈ°

μœ„ν•΄ ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ΄ ν–‰ν•œ λͺ¨λ“  연산을 μ·¨μ†Œν•œλ‹€λŠ” νŠΉμ§•μ„ 가지고 μžˆλ‹€.

ν•΄λ‹Ή 연산은 νŠΈλžœμž­μ…˜μ΄ μ‹œμž‘λ˜κΈ° μ΄μ „μ˜ μƒνƒœλ‘œ λ˜λŒλ¦°λ‹€.

즉, λ§ˆμ§€λ§‰ Commit을 μ™„λ£Œν•œ μ‹œμ μœΌλ‘œ λ‹€μ‹œ λŒμ•„κ°„λ‹€. Commitν•˜μ—¬ μ €μž₯ν•œ κ²ƒλ§Œ λ³΅κ΅¬ν•œλ‹€.

Rollbackμ‹œμ—λŠ” ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ„ μž¬μ‹œμž‘ν•˜κ±°λ‚˜ νκΈ°ν•œλ‹€.


3. Save Point

μž„μ‹œμ €μž₯ λ˜λŠ” λΆ€λΆ„μ €μž₯κ³Ό 같은 λ§₯락으둜 이해할 수 μžˆλ‹€. 보톡 둀백을 λͺ…μ‹œν•˜λ©΄

μ‚½μž…,μ‚­μ œ,μ—…λ°μ΄νŠΈ λ“±μ˜ μž‘μ—… 전체가 μ·¨μ†Œλ˜λŠ”λ°, save pointλŠ” 전체가 μ•„λ‹Œ νŠΉμ • λΆ€λΆ„μ—μ„œ

νŠΈλžœμž­μ…˜μ„ μ·¨μ†Œν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. save pointλ₯Ό μ“°λ©΄ ν˜„μž¬μ˜ νŠΈλžœμž­μ…˜μ„ μž‘κ²Œ λΆ„ν• ν•˜λŠ”

것이 κ°€λŠ₯ν•˜λ‹€. Save pointλŠ” μ—¬λŸ¬ 개의 SQL문의 싀행을 μˆ˜ν–‰ν•˜λŠ” νŠΈλžœμž­μ…˜μ˜ κ²½μš°μ—

μ‚¬μš©μžκ°€ νŠΈλžœμž­μ…˜ 쀑간 λ‹¨κ³„μ—μ„œ save pointλ₯Ό 지정할 수 μžˆλ‹€.

Save pointλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ μ·¨μ†Œν•˜λ €λŠ” 지점을 λͺ…μ‹œν•œ λ’€, κ·Έ μ§€μ κΉŒμ§€ μž‘μ—…μ„ μ·¨μ†Œν•˜λŠ” μ‹μœΌλ‘œ

μ‚¬μš©ν•˜λŠ”λ° 이 지점을 save point라고 ν•œλ‹€.

save pointλ₯Ό μ§€μ •ν•œ λ’€ rollback to save point name을 μ‹€ν–‰ν•˜λ©΄ ν•΄λ‹Ή save point

μ§€μ κΉŒμ§€ μ²˜λ¦¬ν•œ 직업이 λ‘€λ°±λœλ‹€.



πŸ’‘ Transaction μƒνƒœ

Active (ν™œλ™) : νŠΈλžœμž­μ…˜μ΄ 싀행쀑인 μƒνƒœ.

Failed (μ‹€νŒ¨) : νŠΈλžœμž­μ…˜ 싀행에 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ μ€‘λ‹¨λœ μƒνƒœ.

Aborted (철회) : νŠΈλžœμž­μ…˜μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ–΄ Rollback 연산을 μˆ˜ν–‰ν•œ μƒνƒœ.

Partially Committed (λΆ€λΆ„μ™„λ£Œ) : Commit 연산이 μ‹€ν–‰λ˜κΈ° μ§μ „μ˜ μƒνƒœ

Committed (μ™„λ£Œ) : Commit 연산을 μ‹€ν–‰ν•œ ν›„μ˜ μƒνƒœ