‡πŸ‘©‍πŸ’» ‡/ºDatabase

[Database] νŠΈλžœμž­μ…˜κ³Ό ACID

Trudy | 솑연 2024. 8. 6. 08:04

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

νŠΈλžœμž­μ…˜μ΄λž€ DBMSκ°€ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ‹€λ£° λ•Œ μ‚¬μš©ν•˜λŠ” μž‘μ—…(ν”„λ‘œκ·Έλž¨)의 λ‹¨μœ„μ΄λ‹€. 

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터λ₯Ό λ‹€λ£° λ•Œ μž₯μ• κ°€ μΌμ–΄λ‚˜λŠ” κ²½μš°κ°€ μžˆλŠ”λ°, μ΄λ•Œ 데이터λ₯Ό λ³΅κ΅¬ν•˜λŠ” μž‘μ—…μ˜ λ‹¨μœ„κ°€ λœλ‹€. 또, μ—¬λŸ¬ μž‘μ—…μ΄ ν•œλ²ˆμ— 같은 데이터λ₯Ό μ‘°μž‘ν•΄μ„œ λ¬Έμ œκ°€ 생길 λ•Œκ°€ μžˆλŠ”λ°, 이 μž‘μ—…λ“€μ„ μ„œλ‘œ λΆ„λ¦¬ν•΄μ£ΌλŠ” λ‹¨μœ„κ°€ λœλ‹€. 

 

νŠΈλžœμž­μ…˜μ€ 전체가 μˆ˜ν–‰λ˜κ±°λ‚˜ λ˜λŠ” μ „ν˜€ μˆ˜ν–‰λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€. 

예λ₯Ό λ“€μ–΄, Aκ°€ Bμ—κ²Œ 10000원을 μ΄μ²΄ν•˜λŠ” κ²½μš°λŠ” λ‹€μŒκ³Ό 같이 λ™μž‘ν•œλ‹€.

START TRANSACTION
    1. Aμ—μ„œ 10000원을 μΈμΆœν•˜λŠ” SQL UPDATEλ¬Έ
    2. Bμ—μ„œ 10000원을 μž…κΈˆν•˜λŠ” SQL UPDATEλ¬Έ
COMMIT

 

μ΄λ•Œ, COMMIT은 νŠΈλžœμž­μ…˜μ˜ μ’…λ£Œλ₯Ό μ•Œλ¦¬λŠ” SQL문이닀. 

μœ„ 상황을 더 μžμ„Ένžˆ κΈ°λ‘ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€. 

START TRANSACTION
    1. A의 κ³„μ’Œ μž”μ•‘μ„ μ½μ–΄μ˜¨λ‹€
    2. B의 κ³„μ’Œ μž”μ•‘μ„ μ½μ–΄μ˜¨λ‹€
    3. A의 κ³„μ’Œμ—μ„œ 10000원을 λΉΌλŠ” SQL UPDATEλ¬Έ
    4. B의 κ³„μ’Œμ—μ„œ 10000원을 λ”ν•˜λŠ” SQL UPDATEλ¬Έ

COMMIT  //λΆ€λΆ„ μ™„λ£Œ 

5. A κ³„μ’Œ μž”μ•‘μ„ λ°μ΄ν„°λ² μ΄μŠ€μ— 기둝
6. B κ³„μ’Œ μž”μ•‘μ„ λ°μ΄ν„°λ² μ΄μŠ€μ— 기둝

 

DBMSκ°€ λ™μ‹œμ— λ§Žμ€ νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ν•  λ•Œ, 각각의 νŠΈλžœμž­μ…˜μ΄ ν•˜λ“œλ””μŠ€ν¬μ— κ°œλ³„ μ ‘κ·Όν•˜λŠ” 것을 ν”Όν•˜κ³ , μ‚¬μš©μžμ—κ²Œ λ”μš± λΉ λ₯΄κ²Œ μ‘λ‹΅ν•˜κΈ° μœ„ν•΄μ„œ μœ„μ™€ 같이 commit으둜 μž„μ‹œλ‘œ μ’…λ₯˜λ₯Ό μ„ μ–Έν•œ  ν›„, 5,6번이 μ§„ν–‰λ˜μ–΄ λ°μ΄ν„°λ² μ΄μŠ€μ— 기둝을 μˆ˜ν–‰ν•œλ‹€. 

 

νŠΈλžœμž­μ…˜ μˆ˜ν–‰ κ³Όμ •

μ‹œμž‘ -> μˆ˜ν–‰ (1~4) -> λΆ€λΆ„μ™„λ£Œ (COMMIT) -> 버퍼 λ‚΄μš© 기둝 (5~6) -> μ™„λ£Œ

 

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

 

Atomicity μ›μžμ„±

νŠΈλžœμž­μ…˜μ— ν¬ν•¨λœ μž‘μ—…μ€ μ›μžμ²˜λŸΌ 더 이상 μͺΌκ°œμ§€μ§€ μ•ŠλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨ λ‹¨μœ„λ‘œ λ™μž‘ν•΄μ•Ό ν•œλ‹€. 즉, νŠΈλžœμž­μ…˜μ— ν¬ν•¨λœ μž‘μ—…μ€ μ „λΆ€ μˆ˜ν–‰λ˜κ±°λ‚˜, μ „λΆ€ μˆ˜ν–‰λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€. 

 

이λ₯Ό μ§€ν‚€κΈ° μœ„ν•΄μ„œ SQLμ—μ„œλŠ” νŠΈλžœμž­μ…˜μ˜ μ‹œμž‘ (START TRANSATCTION) κ³Ό 끝 (COMMIT) 을 ν‘œκΈ°ν•˜κ³ , μž₯μ• κ°€ 생겼을 λ•Œ 회볡 μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 λ‚΄μš©μ„ μ·¨μ†Œ (ROLLBACK)ν•˜κ³  νŠΉμ • 지점을 μ €μž₯ν•΄ νŠΈλžœμž­μ…˜ 쀑간 지점에 μˆ˜μ •λ‚΄μš©μ„ λ°˜μ˜ν•˜λŠ” 포인트λ₯Ό λ§Œλ“€κΈ°λ„ ν•œλ‹€. (SAVE)

 

ν‘œμ€€ λͺ…λ Ήμ–΄ 문법 μ„€λͺ…
START TRANSACTION SET TRANSACTION  νŠΈλžœμž­μ…˜μ˜ μ‹œμž‘
COMMIT COMMIT νŠΈλžœμž­μ…˜μ˜ μ’…λ£Œ
ROLLBACK ROLLBACK TO <savepoint> νŠΈλžœμž­μ…˜μ„ 전체 ν˜Ήμ€ <savepoint>κΉŒμ§€ λ¬΄νš¨ν™”μ‹œν‚΄
SAVE SAVEPOINT <identifier> <savepoint>λ₯Ό λ§Œλ“¦

 

DBMSλŠ” μ›μžμ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ 회볡(볡ꡬ) κ΄€λ¦¬μž ν”„λ‘œκ·Έλž¨μ„ μž‘λ™μ‹œν‚¨λ‹€.

 

Consistency 일관성

νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ν•˜κΈ° μ „μ΄λ‚˜ μˆ˜ν–‰ν•œ ν›„λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€λŠ” 항상 μΌκ΄€λœ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•œλ‹€. 

 

Aκ³„μ’Œ + B κ³„μ’Œ = 20λ§Œμ›         =>  νŠΈλžœμž­μ…˜ μˆ˜ν–‰   =>       Aκ³„μ’Œ + B κ³„μ’Œ = 20λ§Œμ›

 

DBMSλŠ” 일관성을 μœ μ§€ν•˜λ„λ‘ λ™μ‹œμ„± μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œλ‹€. 

Isolation 고립성

μˆ˜ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ— λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ΄ 끼어듀어 λ³€κ²½ 쀑인 데이터 값을 ν›Όμ†ν•˜λŠ” 일은 μ—†μ–΄μ•Ό ν•œλ‹€.

 

λ™μ‹œμ— μˆ˜ν–‰λ˜λŠ” νŠΈλžœμž­μ…˜μ΄ 같은 데이터λ₯Ό κ°€μ§€κ³  μΆ©λŒν•˜μ§€ μ•Šλ„λ‘ μ œμ–΄ν•˜λŠ” μž‘μ—…μ΄ λ™μ‹œμ„± μ œμ–΄(concurrency control)이닀.  또, λ™μ‹œμ„± μ œμ–΄λ³΄λ‹€ μ™„ν™”λœ λ°©λ²•μœΌλ‘œ νŠΈλžœμž­μ…˜ 고립 μˆ˜μ€€μ„ μ„€μ •ν•˜μ—¬ νŠΈλžœμž­μ…˜μ˜ μƒν˜Έ 간섭을 μ™„ν™”μ‹œν‚€λŠ” 방법도 μžˆλ‹€. 

Durability 지속성

μˆ˜ν–‰μ„ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œν•œ νŠΈλžœμž­μ…˜μ€ λ³€κ²½ν•œ 데이터λ₯Ό 영ꡬ히 μ €μž₯ν•΄μ•Ό ν•œλ‹€. 

 

DBMSλŠ” 지속성을 μœ„ν•΄ 볡ꡬ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λŠ”λ°, 둜그 νŒŒμΌμ„ λ‚¨κ²¨μ„œ 볡ꡬ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ ν•œλ‹€.