πŸ“’ Database

[Database] Transaction(νŠΈλžœμž­μ…˜), ACID. SAVEPOINT?

a n u e 2022. 2. 15. 21:34
λͺ©μ°¨
 νŠΈλžœμž­μ…˜μ΄λž€?
 νŠΈλžœμž­μ…˜ μ—°μ‚° 

 νŠΈλžœμž­μ…˜ μƒνƒœ
 νŠΈλžœμž­μ…˜μ˜ νŠΉμ§•(ACID)
 SAVEPOINT

 

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

  DBλŠ” ν”νžˆ νŠΈλžœμž­μ…˜ λ‹¨μœ„λ‘œ μ²˜λ¦¬λœλ‹€κ³  ν•œλ‹€. νŠΈλžœμž­μ…˜μ€ ν•˜λ‚˜μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ 논리적인 μž‘μ—…μ˜ λ‹¨μœ„μ΄λ‹€. μ£Όμ˜ν•  것은 νŠΈλžœμž­μ…˜μ€ μ§ˆμ˜μ–΄(SELECT, INSERT, UPDATE, DELTE)의 λ‹¨μœ„κ°€ μ•„λ‹ˆλΌλŠ” 점이닀. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžκ°€ κ²Œμ‹œνŒμ— 글을 μ“°κ³ (INSERT), κ·Έ 후에 ν•΄λ‹Ή 글을 λ‹€μ‹œ 쑰회(SELECT)ν•˜λŠ” ν•˜λ‚˜μ˜ μž‘μ—…μ΄ μžˆλ‹€κ³  κ°€μ •ν•˜μž. νŠΈλžœμž­μ…˜μ€ μž‘μ—…μ˜ λ‹¨μœ„μ΄λ―€λ‘œ μ“°λŠ” ν–‰μœ„μ™€ 쑰회 ν–‰μœ„λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•œ 것이 λœλ‹€.

 νŠΈλžœμž­μ…˜ λ‹¨μœ„λ‘œ λ¬Άμ—¬μ§„ 연산은 μ „λΆ€ μ‹€ν–‰λ˜λ˜μ§€, 아무것도 μ‹€ν–‰λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€. 이것이 λ°”λ‘œ DBμ—μ„œ λ§ν•˜λŠ” 'All or Nothing'의 μ˜λ―Έμ΄λ‹€.

 

 νŠΈλžœμž­μ…˜ μ—°μ‚°

  • Commit μ—°μ‚° 

    νŠΈλžœμž­μ…˜μ— λŒ€ν•œ μž‘μ—…μ΄ μ„±κ³΅μ μœΌλ‘œ λλ‚¬μŒμ„ μ•Œλ¦¬λŠ” μ—°μ‚°

 

 

  • Rollback μ—°μ‚°

   νŠΈλžœμž­μ…˜ μ²˜λ¦¬κ°€ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ–΄, νŠΈλžœμž­μ…˜μ˜ 일뢀가 μ •μƒμ μœΌλ‘œ μ²˜λ¦¬λ˜μ—ˆλ”λΌλ„ νŠΈλžœμž­μ…˜μ˜ μ›μžμ„±μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•˜μ—¬ λͺ¨λ“  연산을 μ·¨μ†Œ(Undo)ν•˜λŠ” μ—°μ‚°. Rollbackμ‹œ, ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ„ μž¬μ‹œμž‘ν•˜κ±°λ‚˜ νκΈ°ν•œλ‹€.


 νŠΈλžœμž­μ…˜ μƒνƒœ

 

νŠΈλžœμž­μ…˜ μƒνƒœλ₯Ό μ΄λ―Έμ§€λ‘œ λ‚˜νƒ€λƒ„

 

  • ν™œλ™ : νŠΈλžœμž­μ…˜μ΄ μ‹€ν–‰ 쀑.
  • μ‹€νŒ¨ : νŠΈλžœμž­μ…˜ 싀행에 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ μ€‘λ‹¨λ˜μ–΄μ§„ μƒνƒœ.
  • 철회 : νŠΈλžœμž­μ…˜μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ–΄ Rollbackμ—°μ‚° μˆ˜ν–‰ν•œ μƒνƒœ.
  • λΆ€λΆ„μ™„λ£Œ : νŠΈλžœμž­μ…˜μ˜ λ§ˆμ§€λ§‰ μ—°μ‚°κΉŒμ§€ μ‹€ν–‰λ˜μ—ˆμ§€λ§Œ, Commit μ—°μ‚° μ‹€ν–‰ μ „μ˜ μƒνƒœ.
  • μ™„λ£Œ : νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μ’…λ£Œλ˜μ–΄, Commit 연산이 μˆ˜ν–‰λ˜μ–΄μ§„ μƒνƒœ.

νŠΈλžœμž­μ…˜ νŠΉμ§•(ACID)

νŠΈλžœμž­μ…˜μ˜ μ›μžμ„±, 일관성, ... 싀무 μ „μ—λŠ” λœ¬κ΅¬λ¦„μž‘κΈ° κ°™μ•˜λ˜ κ°œλ…λ“€μ΄ μ΄μ œμ•Ό 쑰금 λͺ…ν™•ν•΄μ§„λ‹€.

 

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

 All or Nothing. νŠΈλžœμž­μ…˜μ€ λͺ¨λ‘ μ„±κ³΅ν•˜λ˜μ§€, μ•„λ‹ˆλ©΄ 아무것도 μ‹€ν–‰λ˜μ§€ μ•Šμ•„μ•Όν•œλ‹€.

μ›μžμ²˜λŸΌ μž‘μ—…μ΄ ν•˜λ‚˜μ˜ 덩어리λ₯Ό 이루고 μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€. 예λ₯Ό λ“€μ–΄, λ‚΄κ°€ μΉœκ΅¬μ—κ²Œ λˆμ„ 10,000원 μ†‘κΈˆν•œλ‹€κ³  ν•˜μž. λ‚΄κ°€ κΈˆμ•‘μ„ μ†‘κΈˆν•˜λ©΄μ„œ κ³„μ’Œμ—μ„œ 10,000원이 차감되고, μΉœκ΅¬λŠ” λˆμ„ λ°›μŒμœΌλ‘œμ¨ κ³„μ’Œμ—μ„œ 10,000원이 μ¦μ•‘λ˜μ–΄μ•Όν•œλ‹€. λ‘˜ 쀑 ν•˜λ‚˜λ§Œ μ²˜λ¦¬λœλ‹€λ©΄ μ›μžμ„±μ„ μœ„λ°°ν•œ 것이닀.

 

2. Consistency(일관성)

 νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ν•˜κ³  λ‚œ 뒀에도 κΈ°μ‘΄ 데이터 베이슀의 μ œμ•½ μ‘°κ±΄μ΄λ‚˜ λ„λ©”μΈμ˜ μœ νš¨λ²”μœ„λ₯Ό μœ„λ°°ν•˜μ§€ μ•ŠλŠ” λ“±, '데이터 베이슀의 정상적인 μƒνƒœλ₯Ό μœ μ§€'ν•΄μ•Όν•œλ‹€. λ§Œμ•½ μ–΄λ–€ ν…Œμ΄λΈ”μ˜ μ»¬λŸΌμ— 무결성 μ œμ•½μ‘°κ±΄μ΄ κ±Έλ €μžˆλŠ”λ°, 이λ₯Ό λ¬΄μ‹œν•˜κ³  νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰λ  수 μ—†λ‹€. 

 

3. Isolation(고립성)

 ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰ν•˜κ³  μžˆλŠ” λ™μ•ˆμ—λŠ”, λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ€ μ ‘κ·Όν•  수 μ—†λ‹€. νŠΈλžœμž­μ…˜ 4κ°œκ°€ 거의 λ™μ‹œμ— μˆ˜ν–‰λ˜λ”λΌλ„ κ·Έ μ•ˆμ—μ„œμ˜ μˆœμ„œλŠ” λΆ„λͺ…ν•˜μ—¬μ•Όν•œλ‹€. λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰μ€‘μΌλ•Œμ—λŠ” lock이 걸리며 쀑간결과λ₯Ό μ ‘κ·Όν•  수 μ—†μœΌλ©°, λŒ€κΈ°μ€‘μ΄μ–΄μ•Ό ν•œλ‹€. 

 

4. Durabilty(μ˜μ†/지속성)

 Commit μ—°μ‚° λ˜μ–΄μ§„ νŠΈλžœμž­μ…˜μ€ λ°μ΄ν„°λ² μ΄μŠ€μ— 영ꡬ적으둜 λ³΄μ‘΄λœλ‹€. 

 


νŠΈλžœμž­μ…˜μ˜ 고립성, 즉 격리성에 λŒ€ν•΄ μ’€ 더 μžμ„Ένžˆ μ•Œμ•„λ³΄μž

νŠΈλžœμž­μ…˜μ˜ κ³ λ¦½μ„±μ΄λž€, ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰ν•˜λŠ” λ™μ•ˆ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ μ ‘κ·Όν•  수 μ—†λ‹€λŠ” 것이닀.

λ™μ‹œμ„±μ„ 높이기 μœ„ν•˜μ—¬ νŠΈλžœμž­μ…˜μ„ λ³‘λ ¬μ²˜λ¦¬ν•˜λ©΄ λ°μ΄ν„°μ˜ 무결성이 깨질 수 μžˆμœΌλ‚˜, 고립성을 보μž₯ν•˜κΈ° μœ„ν•˜μ—¬ νŠΈλžœμž­μ…˜μ„ 순차적으둜 μ‹€ν–‰ν•œλ‹€λ©΄ λ™μ‹œμ„± 처리 μ΄μŠˆκ°€ λ°œμƒν•  수 μžˆλ‹€.

 

이와 κ΄€λ ¨ν•œ λ¬Έμ œμ μ€ 크게 3κ°€μ§€λ‘œ λΆ„λ₯˜λ  수 μžˆλ‹€.

Dirty Read
   λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ— μ˜ν•΄ μˆ˜μ •λμ§€λ§Œ 아직 μ»€λ°‹λ˜μ§€ μ•Šμ€ 데이터λ₯Ό μ½λŠ” 것.
예) AνŠΈλžœμž­μ…˜μ΄ 데이터에 μ ‘κ·Όν•˜μ—¬ ν•΄λ‹Ή 값을 1μ—μ„œ 2둜 λ³€κ²½ν•˜μ˜€λ‹€. 그리고 아직 Commit은 ν•˜μ§€ μ•Šμ•˜λ‹€. 이 λ•Œ, BνŠΈλžœμž­μ…˜μ΄ ν•΄λ‹Ή 데이터λ₯Ό 읽으면 λ‘λ²ˆμ§Έ νŠΈλžœμž­μ…˜μ΄ 읽은 값은ㅑCommit을 ν•˜μ§€ μ•Šμ•˜μŒμ—λ„γ…‘2κ°€ λœλ‹€. BνŠΈλžœμž­μ…˜μ€ 2λ₯Ό κ°€μ§€κ³  본인의 λ‘œμ§μ„ μ²˜λ¦¬ν•œλ‹€. 데이터가 꼬일 것.
Non-Repeatable Read
  ν•œ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ 같은 keyλ₯Ό κ°€μ§„ Rowλ₯Ό 두 번 μ½μ—ˆλŠ”λ°, κ·Έ 사이에 값이 λ³€κ²½λ˜κ±°λ‚˜ μ‚­μ œλ  λ•Œμ˜ 문제.
예) AνŠΈλžœμž­μ…˜μ΄ 데이터λ₯Ό 읽고 μžˆλ‹€. μ΄λ•Œ, BνŠΈλžœμž­μ…˜μ΄ 데이터에 μ ‘κ·Όν•˜μ—¬ ν•΄λ‹Ή 값을 λ³€κ²½/μ‚­μ œν•œ λ’€ Commitν•œλ‹€. μ΄λ•Œ AνŠΈλžœμž­μ…˜μ΄ λ‹€μ‹œ ν•΄λ‹Ή 데이터λ₯Ό 읽으면, Bκ°€ λ³€κ²½/μ‚­μ œν•œ 데이터λ₯Ό 찾게 λœλ‹€.
Phantom Read
  ν•œ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ 같은 쿼리λ₯Ό 두 번 μˆ˜ν–‰ν–ˆλŠ”λ°, 첫 번째 μΏΌλ¦¬μ—μ„œ μ—†λ˜ 유령 λ ˆμ½”λ“œκ°€ 두 번째 μΏΌλ¦¬μ—μ„œ λ‚˜νƒ€λ‚¨.
Non-Repeatable Readκ³Ό ν—·κ°ˆλ¦΄ 수 μžˆλ‹€. Non~은 1개의 Row데이터 값이 λ³€κ²½λ˜λŠ” 것이고, Phanton은 λ‹€ 건을 μš”μ²­ν•˜λŠ” 것에 λŒ€ν•΄ 데이터 값이 λ³€κ²½λ˜λŠ” 것이닀.
예) AνŠΈλžœμž­μ…˜ 쀑, 첫 번째 μΏΌλ¦¬μ—μ„œ νŠΉμ • 쑰건으둜 데이터λ₯Ό κ²€μƒ‰ν•˜μ—¬ κ²°κ³Όλ₯Ό μ–»μ–΄λƒˆλ‹€. 이 λ•Œ, BνŠΈλžœμž­μ…˜μ΄ μ ‘κ·Όν•˜μ—¬ ν•΄λ‹Ή 쑰건의 데이터 일뢀λ₯Ό μ‚­μ œ/μΆ”κ°€ν–ˆμ„λ•Œ AνŠΈλžœμž­μ…˜μ΄ λ‘λ²ˆμ§Έ 쿼리λ₯Ό μ‘°νšŒν•˜λ©΄ BνŠΈλžœμž­μ…˜μ΄ μ‚­μ œ/μΆ”κ°€ν•œ 데이터가 ν•¨κ»˜ 쑰회/λˆ„λ½λœλ‹€. 

SAVE POINTλž€?

보톡 Rollback을 ν•˜λ©΄, INSERT UPDATE, DELETE λ“± μž‘μ—… 전체가 μ·¨μ†Œλœλ‹€. 그런데 μ΄λ•Œ, 전체가 μ•„λ‹Œ νŠΉμ • λΆ€λΆ„μ—μ„œ νŠΈλžœμž­μ…˜μ„ μ·¨μ†Œμ‹œν‚¬ 수 μžˆλ‹€. 즉, SAVEPOINTλ₯Ό μ“°λ©΄ ν•˜λ‚˜μ˜ μ»€λ‹€λž€ νŠΈλžœμž­μ…˜μ„ μž‘κ²Œ 뢄리할 수 μžˆλ‹€. SAVEPOINTλŠ” μ—¬λŸ¬κ°œμ˜ SQL문을 μˆ˜ν–‰ν•˜λŠ” 경우, μ‚¬μš©μžκ°€ νŠΈλžœμž­μ…˜ 쀑간 λ‹¨κ³„μ—μ„œ SAVEPOINTλ₯Ό μ§€μ •ν•  수 μžˆλ‹€. 

 

 

1)
SQL 1 μˆ˜ν–‰
COMMIT

2)
SQL 2 μˆ˜ν–‰
SAVEPOINT 1 μ„€μ •

3)
SQL 3 μˆ˜ν–‰
SAVEPOINT 2 μ„€μ •

4)
SQL 4 μˆ˜ν–‰

 

SQL1;
COMMIT;
SQL2;
SAVEPOINT 1;
SQL3;
SAVEPOINT 2;
SQL4;
ROLLBACK TO 2; --SQL4 μˆ˜ν–‰ μ „μœΌλ‘œ λŒμ•„κ°„λ‹€.
ROLLBACK TO 1; --SQL3 μˆ˜ν–‰ μ „μœΌλ‘œ λŒμ•„κ°„λ‹€.
ROLLBACK; --SQL2 μˆ˜ν–‰ μ „μœΌλ‘œ λŒμ•„κ°„λ‹€. μ΅œμ’…μ μœΌλ‘œ SQL1만 COMMIT μ—°μ‚° 된 μƒνƒœ.