Skip to content

Latest commit

Β 

History

History

20. Transaction Processing

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Β 
Β 
Β 
Β 

λͺ©μ°¨

Transaction Processing

  • λ°μ΄ν„°μ˜ κ³΅μœ μ™€ λ‹€μˆ˜ μ‚¬μš©μž νŠΈλžœμž­μ…˜ 처리
    • μ—¬λŸ¬ μ‚¬μš©μžκ°€ (λ™μ‹œμ—) λ™μΌν•œ λ°μ΄ν„°λ² μ΄μŠ€ 곡유 κ°€λŠ₯ν•˜λ„λ‘ 지원
    • λ™μ‹œμ— μ‚¬μš©ν•˜λ”λΌλ„ 일관성(consistency)을 보μž₯ν•˜κΈ° μœ„ν•œ λ™μ‹œμ„± μ œμ–΄ (concurrency control) κΈ°λŠ₯ 제곡

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

  • λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ³€ν™˜μ‹œν‚€λŠ” ν•˜λ‚˜μ˜ 논리적 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μž‘μ—…μ˜ λ‹¨μœ„ ν”„λ‘œμ„ΈμŠ€ (예: κ³„μ’Œμ΄μ²΄, μ’Œμ„μ˜ˆμ•½)
    • μž₯μ• κ°€ 일어날 λ•Œ 데이터λ₯Ό λ³΅κ΅¬ν•˜λŠ” μž‘μ—…μ˜ λ‹¨μœ„κ°€ 됨
    • λ™μ‹œμ— 같은 데이터λ₯Ό λ‹€λ£° λ•Œκ°€ 이 μž‘μ—…μ„ μ„œλ‘œ λΆ„λ¦¬ν•˜λŠ” λ‹¨μœ„κ°€ 됨
  • ν•˜λ‚˜μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 연산듀을 λͺ¨μ•„놓은 것 (ν•œκΊΌλ²ˆμ— λͺ¨λ‘ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•  일련의 μ—°μ‚°λ“€)

νŠΈλžœμž­μ…˜μ˜ μ£Όμš” μ„±μ§ˆ: ACID

  • Atomicity (μ›μžμ„±)
    • νŠΈλžœμž­μ…˜κ³Ό κ΄€λ ¨λœ μž‘μ—…λ“€μ€ μ „λΆ€ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜κ±°λ‚˜, μ•„μ˜ˆ ν•˜λ‚˜λ„ μ‹€ν–‰λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€. (all or nothing)
  • Consistency (일관성)
    • νŠΈλžœμž­μ…˜μ΄ μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λœ 후에도, λ°μ΄ν„°λ² μ΄μŠ€λŠ” 항상 μΌκ΄€λœ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•œλ‹€.
  • Isolation (격리성, 고립성)
    • ν˜„μž¬ μˆ˜ν–‰ 쀑인 νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ νŠΈλžœμž­μ…˜μ΄ μƒμ„±ν•œ 쀑간 μ—°μ‚° 결과에, λ‹€λ₯Έ νŠΈλžœμž­μ…˜λ“€μ΄ μ ‘κ·Όν•  수 μ—†μ–΄μ•Ό ν•œλ‹€.
  • Durability (지속성, μ˜μ†μ„±)
    • μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λœ νŠΈλžœμž­μ…˜μ€ μ†μ‹€λ˜μ§€ μ•Šκ³ , 영ꡬ적으둜 λ°˜μ˜λ˜μ–΄μ•Ό ν•œλ‹€.

μ›μžμ„±μ„ μœ„ν•œ μ—°μ‚°

  • Commit (μ™„λ£Œ)
    • νŠΈλžœμž­μ…˜μ˜ 성곡적인 μ‹€ν–‰
      • 일관성 μžˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœ (Consistency)
    • 영ꡬ적인 κ°±μ‹ 
    • κ°±μ‹ λœ λ°μ΄ν„°μ˜ μ˜μ†μ„±μ„ 보μž₯ (Durability)
  • Rollback (μ·¨μ†Œ, 볡귀)
    • νŠΈλžœμž­μ…˜ μ‹€ν–‰μ˜ μ‹€νŒ¨
      • λͺ¨μˆœλœ λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœ
    • μˆ˜ν–‰ν•œ λͺ¨λ“  μ—°μ‚° 결과의 UNDO

MySQL의 autocommit, commit, rollback

mysql> SHOW VARIABLES LIKE "%commit%";
+-----------------------------------------+-------------------+
| Variable_name                           | Value             |
+-----------------------------------------+-------------------+
| autocommit                              | ON                |
| binlog_group_commit_sync_delay          | 0                 |
| binlog_group_commit_sync_no_delay_count | 0                 |
| binlog_order_commits                    | ON                |
| innodb_api_bk_commiTinterval           | 5                 |
| innodb_commit_concurrency               | 0                 |
| innodb_flush_log_at_trx_commit          | 1                 |
| original_commit_timestamp               | 36028797018963968 |
| replica_preserve_commit_order           | ON                |
| replication_sender_observe_commit_only  | OFF               |
| slave_preserve_commit_order             | ON                |
+-----------------------------------------+-------------------+
11 rows in set (0.06 sec)

mysql> SET autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE "%commit%";
+-----------------------------------------+-------------------+
| Variable_name                           | Value             |
+-----------------------------------------+-------------------+
| autocommit                              | OFF               |
| binlog_group_commit_sync_delay          | 0                 |
| binlog_group_commit_sync_no_delay_count | 0                 |
| binlog_order_commits                    | ON                |
| innodb_api_bk_commiTinterval           | 5                 |
| innodb_commit_concurrency               | 0                 |
| innodb_flush_log_at_trx_commit          | 1                 |
| original_commit_timestamp               | 36028797018963968 |
| replica_preserve_commit_order           | ON                |
| replication_sender_observe_commit_only  | OFF               |
| slave_preserve_commit_order             | ON                |
+-----------------------------------------+-------------------+
11 rows in set (0.00 sec)
mysql> CREATE TABLE customer (a INT, b CHAR (20), INDEX (a));
Query OK, 0 rows affected (0.00 sec)

mysql> -- Do a transaction with autocommit turned on.
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO customer VALUES (10, 'Heikki');
Query OK, 1 row affected (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)

mysql> -- Do another transaction with autocommit turned off.
mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysq1> INSERT INTO customer VALUES (15, 'John');
Query OK, 1 row affected (0.00 sec)

mysq1> INSERT INTO customer VALUES (20, 'Paul');
Query OK, 1 row affected (0.00 sec)

mysql> DELETE FROM customer WHERE b = 'Heikki';
Query OK, 1 row affected (0.00 sec)

mysql> -- Now we undo those last 2 inserts and the delete.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM customer;
+------+---------+
| a    | b       |
+------+---------+
|   10 | Heikki  |
+------+---------+
1 row in set (0.00 sec)

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

  • νŠΈλžœμž­μ…˜μ˜ μƒνƒœλŠ” 닀섯가지 μƒνƒœ 쀑 ν•˜λ‚˜μ— μ†ν•˜κ²Œ λœλ‹€.
    • ν™œλ™ μƒνƒœ
      • νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰λ˜κΈ° μ‹œμž‘ν•˜μ—¬ ν˜„μž¬ μˆ˜ν–‰ 쀑인 μƒνƒœ
    • λΆ€λΆ„ μ™„λ£Œ μƒνƒœ
      • νŠΈλžœμž­μ…˜μ˜ λ§ˆμ§€λ§‰ 연산이 μ‹€ν–‰λœ μ§ν›„μ˜ μƒνƒœ.
      • λͺ¨λ“  μ—°μ‚°μ˜ μ²˜λ¦¬κ°€ λλ‚¬μ§€λ§Œ νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰λœ μ΅œμ’… κ²°κ³Όλ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— 아직 λ°˜μ˜ν•˜μ§€ μ•Šμ€ μƒνƒœ
    • μ™„λ£Œ μƒνƒœ
      • μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ–΄ 컀밋 연산을 μ‹€ν–‰ν•œ μƒνƒœ
    • μ‹€νŒ¨ μƒνƒœ
      • μž₯μ• κ°€ λ°œμƒν•˜μ—¬ νŠΈλžœμž­μ…˜μ˜ μˆ˜ν–‰μ΄ μ€‘λ‹¨λœ μƒνƒœ
    • 철회 μƒνƒœ
      • νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ν•˜λŠ”λ° μ‹€νŒ¨ν•˜μ—¬ 둀백연산을 μ‹€ν–‰ν•œ μƒνƒœ

Transaction_status

  • ν”„λ‘œκ·Έλž¨ : ν•˜λ‚˜ μ΄μƒμ˜ νŠΈλžœμž­μ…˜μ„ 포함
    • ν”„λ‘œκ·Έλž¨μ˜ 성곡적인 μˆ˜ν–‰ = λͺ¨λ“  νŠΈλžœμž­μ…˜μ˜ 성곡적인 μ™„λ£Œ

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

  • κ³„μ’Œ Aμ—μ„œ κ³„μ’Œ B둜 100원을 이체
  • BEGIN_TRANS;
        UPDATE ACCOUNT SET Balance = Balance - 100 WHERE Accnt = 'A';
        IF ERROR GO TO UNDO;
    
        UPDATE ACCOUNT SET Balance = Balance + 100 WHERE Accnt = 'B';
        IF ERROR GO TO UNDO;
    
        COMMIT TRANS;
        GO TO FINISH
        UNDO:
            ROLLBACK TRANS;
        FINISH:
            RETURN;
    END_TRANS;

μ‹€νŒ¨ μƒνƒœμ— μžˆλŠ” νŠΈλžœμž­μ…˜

  • λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλ₯Ό νŠΈλžœμž­μ…˜ 싀행이 μ‹œμž‘λ˜κΈ° μ§μ „μ˜ μƒνƒœλ‘œ ν™˜μ› μ‹œν‚€κΈ° μœ„ν•΄ Rollback μ—°μ‚° μ‹€ν–‰
  • κ·Έ λ’€μ—μ„œ 철회 μƒνƒœμ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ λ˜μ–΄ μ’…λ£Œ
  • μ΄λ•Œ μ·¨ν•  수 μžˆλŠ” 쑰치
    • νŠΈλžœμž­μ…˜μ˜ μž¬μ‹œμž‘ : ν•˜λ“œμ›¨μ–΄λ‚˜ μ‹œμŠ€ν…œ μ†Œν”„νŠΈμ›¨μ–΄ 였λ₯˜λ‘œ 인해 철회된 νŠΈλžœμž­μ…˜μ€ λ‹€μ‹œ μƒˆλ‘œμš΄ νŠΈλžœμž­μ…˜μœΌλ‘œ μ·¨κΈ‰λ˜μ–΄ μž¬μ‹œμž‘
    • νŠΈλžœμž­μ…˜μ˜ 폐기 : νŠΈλžœμž­μ…˜μ˜ 내뢀적 였λ₯˜λ‘œ μž¬μž‘μ„±μ„ ν•΄μ•Ό ν•˜λ“ μ§€ μ›ν•˜λŠ” 데이터가 λ°μ΄ν„°λ² μ΄μŠ€μ— μ—†λŠ” κ²½μš°μ— μ·¨ν•˜λŠ” 쑰치

μž₯μ• 

  • μ‹œμŠ€ν…œμ΄ 정해진 λͺ…μ„ΈλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” μƒνƒœ
  • 원인 : ν•˜λ“œμ›¨μ–΄ 결함, μ†Œν”„νŠΈμ›¨μ–΄μ˜ λ…Όλ¦¬μ˜€λ₯˜, μ‚¬λžŒμ˜ μ‹€μˆ˜
  • μž₯μ• μ˜ μœ ν˜•
    • νŠΈλžœμž­μ…˜ μž₯μ•  : 논리적 였λ₯˜, μž…λ ₯ λ°μ΄ν„°μ˜ λΆˆλŸ‰
    • μ‹œμŠ€ν…œ μž₯μ•  : ν•˜λ“œμ›¨μ–΄μ˜ μ˜€λ™μž‘
    • λ―Έλ””μ–΄ μž₯μ•  : λ””μŠ€ν¬ ν—€λ“œ λΆ•κ΄΄ λ˜λŠ” κ³ μž₯

μ €μž₯μž₯μΉ˜μ™€ μž₯μ• 

  • νœ˜λ°œμ„± μ €μž₯ μž₯치
    • μž₯μ• κ°€ λ°œμƒν•˜λ©΄ μ €μž₯된 데이터가 손싀됨 (메인 λ©”λͺ¨λ¦¬)
  • λΉ„νœ˜λ°œμ„± μ €μž₯ μž₯치
    • μž₯μ• κ°€ λ°œμƒν•΄λ„ μ €μž₯된 데이터가 μ†μ‹€λ˜μ§€ μ•ŠμŒ.
    • 단, λ””μŠ€ν¬ 헀더 손상 같은 μ €μž₯ μž₯치 μžμ²΄μ— 이상이 λ°œμƒν•˜λ©΄ 데이터가 손싀될 μˆ˜λ„ 있음
  • μ•ˆμ • μ €μž₯ μž₯치
    • λΉ„νœ˜λ°œμ„± μ €μž₯ μž₯치λ₯Ό μ΄μš©ν•΄ 데이터 볡사본 μ—¬λŸ¬ 개λ₯Ό λ§Œλ“œλŠ” λ°©λ²•μœΌλ‘œ, μ–΄λ–€ μž₯μ• κ°€ λ°œμƒν•΄λ„ 데이터가 μ†μ‹€λ˜μ§€ μ•Šκ³  데이터λ₯Ό 영ꡬ적으둜 μ €μž₯ν•  수 있음

회볡 (recovery)

  • λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μž₯μ•  λ°œμƒ μ΄μ „μ˜ μΌκ΄€λœ μƒνƒœ (consistent state)둜 λ³΅μ›μ‹œν‚€λŠ” 것
    • μΌκ΄€λœ μƒνƒœ : λ°μ΄ν„°λ² μ΄μŠ€μ— 였λ₯˜κ°€ μ—†λŠ” μƒνƒœ, λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ‚΄μš©μ— λͺ¨μˆœμ΄ μ—†λŠ” μƒνƒœ
  • 기본원리 : 쀑볡(redundancy)

νšŒλ³΅μ„ μœ„ν•œ μ—°μ‚°

  • 덀프 (dump)
    • full backup, λ°μ΄ν„°λ² μ΄μŠ€ 전체λ₯Ό λ‹€λ₯Έ μ €μž₯ μž₯μΉ˜μ— 주기적으둜 λ³΅μ‚¬ν•˜λŠ” 방법 (archive)
  • 둜그 (log, journal)
    • λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ³€κ²½ 연산이 싀행될 λ•Œλ§ˆλ‹€, 데이터λ₯Ό λ³€κ²½ν•˜κΈ° 이전 κ°’κ³Ό λ³€κ²½ν•œ μ΄ν›„μ˜ 값을 λ³„λ„μ˜ νŒŒμΌμ— κΈ°λ‘ν•˜λŠ” 방법
  • REDO (μž¬μ‹€ν–‰) : κ°€μž₯ 졜근 볡제본 + 둜그
    • κ°€μž₯ μ΅œκ·Όμ— μ €μž₯ν•œ λ°μ΄ν„°λ² μ΄μŠ€ 볡사본을 κ°€μ Έμ˜¨ ν›„ 둜그λ₯Ό μ΄μš©ν•΄ 볡사본이 λ§Œλ“€μ–΄μ§„ 이후에 μ‹€ν–‰λœ λͺ¨λ“  λ³€κ²½ 연산을 μž¬μ‹€ν–‰ν•˜μ—¬ μž₯μ• κ°€ λ°œμƒν•˜κΈ° μ§μ „μ˜ λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλ‘œ 볡ꡬ
    • μ „λ°˜μ μœΌλ‘œ μ†μƒλœ κ²½μš°μ— 주둜 μ‚¬μš©
  • UNDO (μ·¨μ†Œ) : 둜그 + λͺ¨λ“  변경듀을 μ·¨μ†Œ
    • 둜그λ₯Ό μ΄μš©ν•΄ μ§€κΈˆκΉŒμ§€ μ‹€ν–‰λœ λͺ¨λ“  λ³€κ²½ 연산을 μ·¨μ†Œν•˜μ—¬ ν–ˆλ˜ 것을 μ—†λ˜ κ²ƒμ²˜λŸΌ μ›λž˜μ˜ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ³΅μ›ν•˜λŠ” 것
    • λ³€κ²½ μ€‘μ΄μ—ˆκ±°λ‚˜ 이미 λ³€κ²½λœ λ‚΄μš©λ§Œ 신뒰성을 μžƒμ€ κ²½μš°μ— 주둜 μ‚¬μš©

λ°μ΄ν„°λ² μ΄μŠ€ 둜그 : 둜그 μ••μΆ•

  • λͺ©μ  : μ €μž₯μž₯치의 νš¨μœ¨μ„±, μ‹ μ†ν•œ 회볡
  • 이유
      1. μ‹€νŒ¨ν•œ νŠΈλžœμž­μ…˜μ€ 둜그 λΆˆν•„μš”
      • νŠΈλžœμž­μ…˜μ΄ 이미 rollback λ˜μ—ˆμŒ
      1. μ„±κ³΅ν•œ νŠΈλžœμž­μ…˜μ˜ κ°±μ‹  μ „ λ°μ΄ν„°λŠ” λΆˆν•„μš”
      • REDOλ₯Ό μœ„ν•΄ μƒˆλ‘œμš΄ κ°’λ§Œ ν•„μš”
      1. ν•˜λ‚˜μ˜ 데이터 μ•„μ΄ν…œμ΄ μ—¬λŸ¬ νŠΈλžœμž­μ…˜μ— μ˜ν•΄ μ—¬λŸ¬ 번 κ°±μ‹ λ˜μ—ˆλ‹€λ©΄ κ°€μž₯ λ§ˆμ§€λ§‰ 데이터 κ°’λ§Œ ν•„μš”
      • REDO μ‹œ 쀑간 κ³Όμ •μ˜ 데이터 값은 λΆˆν•„μš”

λ‹€μ–‘ν•œ 회볡 기법

(1-1) μ¦‰μ‹œ κ°±μ‹  회볡 기법

νŠΈλžœμž­μ…˜ μˆ˜ν–‰ 도쀑 데이터λ₯Ό λ³€κ²½ν•˜λ©΄ λ³€κ²½ 정보λ₯Ό 둜그 νŒŒμΌμ— μ €μž₯ν•˜κ³ , νŠΈλžœμž­μ…˜μ΄ λΆ€λΆ„ μ™„λ£Œλ˜κΈ° 전이라도 λͺ¨λ“  λ³€κ²½ λ‚΄μš©μ„ μ¦‰μ‹œ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•˜λŠ” 기법

  • νŠΉμ§•
    • 회볡 μ‹œ 둜그 νŒŒμΌμ„ μ°Έμ‘°ν•˜μ—¬ Redo와 Undo 연산을 λͺ¨λ‘ μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€.
    • νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ˜κΈ° μ „ μž₯μ• κ°€ λ°œμƒν•œ 경우 : Undo
      • 만일 λ‘œκ·Έμ— <Ti, Start> λ ˆμ½”λ“œλ§Œ 있고 <Ti, Commit> λ ˆμ½”λ“œκ°€ μ—†μœΌλ©΄ Undo(Ti)λ₯Ό μˆ˜ν–‰
    • νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλœ ν›„ μž₯μ• κ°€ λ°œμƒν•œ 경우: Redo
      • 만일 λ‘œκ·Έμ— <Ti, Start> λ ˆμ½”λ“œμ™€ <Ti, Commit> λ ˆμ½”λ“œκ°€ λͺ¨λ‘ λ‹€ 있으면 Redo(Ti)λ₯Ό μˆ˜ν–‰
  • κ΅¬ν˜„
    • νŠΈλžœμž­μ…˜ ν™œμ„± μƒνƒœμ—μ„œ 데이터 λ³€κ²½ κ²°κ³Όλ₯Ό λ‘œκ·Έμ™€ λ°μ΄ν„°λ² μ΄μŠ€μ— 반영
    • 회볡 μ‹œ νŠΈλžœμž­μ…˜ μ‹€ν–‰ μ΄μ „μ˜ μƒνƒœλ‘œ 볡ꡬ
    • 둜그 νŒŒμΌμ„ μ°Έμ‘°ν•˜μ—¬ λ―Έμ™„λ£Œλœ 변경에 λŒ€ν•΄ Undoλ₯Ό μš°μ„  μ‹€ν–‰ν•œ ν›„, μ™„λ£Œλœ 변경에 λŒ€ν•΄ Redo μ‹€ν–‰
  • 적용의 예 (<T1, T2> 순으둜 μ‹€ν–‰)
    • T1이 Commitν•˜κΈ° 직전에 μ‹œμŠ€ν…œ λΆ•κ΄΄
      • Undo(T1)μ‹€ν–‰
    • T2κ°€ Commitν•˜κΈ° 직전에 μ‹œμŠ€ν…œ λΆ•κ΄΄
      • Undo(T2)λ₯Ό λ¨Όμ € μ‹€ν–‰, λ‹€μŒ Redo(T1) μ‹€ν–‰
        • 일반적으둜 λͺ¨λ“  Undo 후에 Redoλ₯Ό ν•΄μ•Ό 함
    • T2κ°€ <T2, Commit>둜그 λ ˆμ½”λ“œ 좜λ ₯ 직후 μ‹œμŠ€ν…œ λΆ•κ΄΄
      • Redo(T1), Redo(T2) μ‹€ν–‰
        • UndoλŠ” μ—­μˆœ, RedoλŠ” 기둝된 μˆœμ„œλŒ€λ‘œ μ‹€ν–‰

(1-2) 지연 κ°±μ‹  회볡 기법

νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰λ˜λŠ” λ™μ•ˆμ—λŠ” 데이터 λ³€κ²½ μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ¦‰μ‹œλ°˜μ˜ν•˜μ§€ μ•Šκ³  둜그 νŒŒμΌμ—λ§Œ κΈ°λ‘ν•΄λ‘μ—ˆλ‹€κ°€, νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλœ 후에 λ‘œκ·Έμ— 기둝된 λ‚΄μš©μ„ μ΄μš©ν•΄ λ°μ΄ν„°λ² μ΄μŠ€μ— ν•œ λ²ˆμ— 반영

  • νŠΉμ§•
    • νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰λ˜λŠ” λ™μ•ˆ μž₯μ• κ°€ λ°œμƒν•  경우 λ‘œκ·Έμ— 기둝된 λ‚΄μš©μ„ λ²„λ¦¬κΈ°λ§Œ ν•˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ›λž˜ μƒνƒœλ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•˜κ²Œ λœλ‹€.
      • 지연 κ°±μ‹  회볡 κΈ°λ²•μ—μ„œλŠ” REDI μ—°μ‚°λ§Œ μ΄μš©ν•¨
        • λ°μ΄ν„°λ² μ΄μŠ€ 회볡 κ³Όμ •μ—μ„œ UNDOλŠ” ν•„μš” μ—†μŒ. νŠΈλžœμž­μ…˜ 볡ꡬ μ‹œ 둜그 파일 λ‚΄μš©λ§Œ 폐기
    • νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ˜κΈ° μ „ μž₯μ• κ°€ λ°œμƒν•œ 경우: 둜그 λ‚΄μš©μ„ λ¬΄μ‹œν•˜κ³  버림
    • νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλœ ν›„ μž₯μ• κ°€ λ°œμƒν•œ 경우: Redo
    • λΆ€λΆ„ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λͺ¨λ“  Output 연산을 지연
      • λͺ¨λ“  λ°μ΄ν„°λ² μ΄μŠ€μ˜ 변경을 λ‘œκ·Έμ— λ¨Όμ € 기둝
      • μ•ˆμ „ν•œ μ €μž₯μ†Œμ— <Ti, Commit>λ₯Ό ν¬ν•¨ν•˜λŠ” 둜그 λ ˆμ½”λ“œλ₯Ό κΈ°λ‘ν•œ 후에 λ°μ΄ν„°λ² μ΄μŠ€ κ°±μ‹ 
        • μ™„λ£Œ μƒνƒœλ‘œ 감
        • <Ti, Commit>λŠ” λΆ€λΆ„μ μœΌλ‘œ 기둝
      • 둜그 λ ˆμ½”λ“œ : REDO 연산에 λŒ€λΉ„. μ˜ˆμ „κ°’λ„ ν•„μš”μ—†μŒ
        • <νŠΈλžœμž­μ…˜ id, 데이터 μ•„μ΄ν…œ, λ³€κ²½λœ κ°’>
    • Redo 연산은 idempotent μ„±μ§ˆμ„ 가지고 μžˆμ–΄μ•Ό 함
      • 같은 Redoλ₯Ό μ—¬λŸ¬λ²ˆ μ‹€ν–‰ν•œ κ²ƒμ΄λ‚˜ ν•œ 번 μ‹€ν–‰ν•œ κ²ƒμ΄λ‚˜ κ·Έ κ²°κ³ΌλŠ” 동등
      • Redo μž‘μ—… 쀑 λ‹€μ‹œ μž₯μ• κ°€ μΌμ–΄λ‚˜ Redo 연산을 또 λ‹€μ‹œ μ‹€ν–‰ν•˜λ”λΌλ„ 처음 ν•œ 번 μ‹œν–‰ν•œ 결과와 동일
      • Redo(Redo(Redo...(x))) = Redo(x)
  • κ΅¬ν˜„
    • νŠΈλžœμž­μ…˜ λ‹¨μœ„κ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ λ””μŠ€ν¬μ— κΈ°λ‘ν•˜λŠ” 좜λ ₯ 연산을 μ§€μ—°μ‹œν‚€κ³ , λ°μ΄ν„°λ² μ΄μŠ€ λ³€κ²½ 내역을 λ‘œκ·Έμ— 보관
    • νŠΈλžœμž­μ…˜ μ™„λ£Œ(Commit) μ‹œ 둜그λ₯Ό μ΄μš©ν•΄ μ§€μ—°λœ 좜λ ₯ μ—°μ‚°(Redo) μˆ˜ν–‰
    • νŠΈλžœμž­μ…˜μ΄ μ‹€νŒ¨ν•  경우 Undo 없이 둜그 λ‹¨μˆœ 폐기
μ–΄λ–€ νŠΈλžœμž­μ…˜μ΄ Redo λ˜μ–΄μ•Ό ν•˜λŠ”κ°€?
  • λ‘œκ·Έμ— <Ti, Start> λ ˆμ½”λ“œμ™€ <Ti, Commit> λ ˆμ½”λ“œκ°€ λͺ¨λ‘ μžˆλŠ” νŠΈλžœμž­μ…˜ Ti에 λŒ€ν•΄μ„œλ§Œ μž¬μ‹€ν–‰
  • 회볡절차 : μ„Έ 개의 μƒμ΄ν•œ μ‹œμ μ˜ 둜그
    • λ‘œκ·Έμ— Commit λ ˆμ½”λ“œκ°€ μžˆλŠ” νŠΈλžœμž­μ…˜μ— λŒ€ν•΄μ„œ Redo λ‹€μ‹œ μ‹€ν–‰

(2) κ²€μ‚¬μ‹œμ  회볡

λ°μ΄ν„°λ² μ΄μŠ€ νŠΈλžœμž­μ…˜ λ™μž‘ 과정에 주기적으둜 검사점을 κΈ°λ‘ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ μž₯μ• μ‹œ 둜그λ₯Ό 기반으둜 νšŒλ³΅ν•˜λŠ” 기법

  • νŠΉμ§•
    • κ²€μ‚¬μ‹œμ μ„ λ„μž…ν•˜λ©΄μ„œ, Undoλ₯Ό λ‹€μ‹œ λ„μž…ν•¨
    • νšŒλ³΅μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ‹œμŠ€ν…œμ€ μƒˆλ‘œμš΄ νŠΈλžœμž­μ…˜μ„ 받아듀일 수 μ—†μŒ
  • λ™μž‘
    • μž₯μ•  λ°œμƒ μ‹œ 검사점 이전에 처리된 νŠΈλžœμž­μ…˜μ€ νšŒλ³΅μ—μ„œ μ œμ™Έν•˜κ³ 
    • 검사점 이후에 처리된 νŠΈλžœμž­μ…˜μ€ 회볡 μž‘μ—… μˆ˜ν–‰
      • 검사점 이후, μž₯μ•  λ°œμƒ 이전에 commit이 μ™„λ£Œλœ 경우 Redo μˆ˜ν–‰
      • μž₯μ•  λ°œμƒ μ‹œμ κΉŒμ§€ commitλ˜μ§€ λͺ»ν•œ 경우 Undo μˆ˜ν–‰
      • Undo/Redo의 μˆ˜ν–‰
        • Step 1. Undo-list에 μžˆλŠ” λͺ¨λ“  νŠΈλžœμž­μ…˜λ“€μ— λŒ€ν•΄ λ‘œκ·Έμ— 기둝된 μ—­μˆœμœΌλ‘œ Undo μ—°μ‚° μˆ˜ν–‰
        • Step 2. 그런 λ‹€μŒ Redo-list에 μžˆλŠ” νŠΈλžœμž­μ…˜μ— λŒ€ν•΄ λ‘œκ·Έμ— 기둝된 μˆœμ„œλ‘œ Redoλ₯Ό μˆ˜ν–‰
  • κ²€μ‚¬μ‹œμ  (Checkpoint) 방법
    • 둜그 기둝 μœ μ§€, μΌμ •μ‹œκ°„ κ°„κ²©μœΌλ‘œ κ²€μ‚¬μ‹œμ  (Checkpoint) μ„€μ •
      • 메인 λ©”λͺ¨λ¦¬(둜그 버퍼)에 μžˆλŠ” λͺ¨λ“  둜그 λ ˆμ½”λ“œλ₯Ό μ•ˆμ • μ €μž₯μ†Œλ‘œ 좜λ ₯
      • λ³€κ²½λœ 데이터 버퍼 블둝을 μ „λΆ€ λ””μŠ€ν¬λ‘œ 좜λ ₯
      • 검사 μ‹œμ  ν‘œμ‹œλ‘œμ¨ 둜그 λ ˆμ½”λ“œλ₯Ό μ•ˆμ • μ €μž₯μ†Œμ— 좜λ ₯
        • 이 λ•Œ, L은 ν˜„μž¬ μ‹€ν–‰ 쀑에 μžˆλŠ” νŠΈλžœμž­μ…˜λ“€μ˜ 리슀트
κ²€μ‚¬μ‹œμ (checkpoint) 회볡이 ν•„μš”ν•œ 이유

μΌμ •ν•œ κ°„κ²©μœΌλ‘œ μƒμ„±λœ κ²€μ‚¬μ‹œμ μ€ μž₯μ• κ°€ λ°œμƒν–ˆμ„ λ•Œ, λΆˆν•„μš”ν•œ λΆ€ν•˜λ₯Ό μ€„μ΄κ²Œ 됨으둜써 회볡 처리 절차의 μ‹œκ°„μ„ μ ˆμ•½ν•΄ μ€€λ‹€.
μ‹œμŠ€ν…œ μ—λŸ¬κ°€ 났을 λ•Œ νšŒλ³΅κ΄€λ¦¬μžκ°€ 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 둜그 전체λ₯Ό 뢄석해야 λ˜λŠ”λ° μ‹œκ°„μ΄ 많이 μ†Œμš”λ˜κ³  λΆˆν•„μš”ν•œ REDO 연산을 λ°˜λ³΅ν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜λ―€λ‘œ κ²€μ‚¬μ‹œμ  회볡이 ν•„μš”ν•˜λ‹€.

(3) λ―Έλ””μ–΄ 회볡 기법

  • κ΅¬ν˜„
    • 둜그 μš°μ„  기둝 κ·œμ•½ (write-ahead log protocol)
      • 둜그λ₯Ό λ””μŠ€ν¬μ— μ¨μ•Όμ§€λ§Œ 컀밋할 수 μžˆλ‹€.

References

  1. Fundamentals of Database Systems 7th Edition by Ramez Elmasri, Shamkant B. Navathe.
  2. https://overcome-the-limits.tistory.com/528
  3. https://itwiki.kr/w/%EB%A1%9C%EA%B7%B8_%EA%B8%B0%EB%B0%98_%ED%9A%8C%EB%B3%B5_%EA%B8%B0%EB%B2%95
  4. https://m.blog.naver.com/wook2124/222108776229
  5. https://itwiki.kr/w/%EA%B2%80%EC%82%AC%EC%A0%90_%ED%9A%8C%EB%B3%B5_%EA%B8%B0%EB%B2%95
  6. https://www.studocu.com/ko/document/dankook-university/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B4%80%EB%A6%AC/%EA%B2%BD%EC%98%81%ED%95%99%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B0%9C%EB%A1%A0-%EA%B8%B0%EB%A7%90%EA%B3%A0%EC%82%AC-%EB%8C%80%EB%B9%84-%EC%9E%90%EB%A3%8C-%EA%B5%90%EC%9E%AC-%EB%B0%8F-%EC%88%98%EC%97%85-%EB%82%B4%EC%9A%A9-%ED%95%84%EA%B8%B0-%EB%85%B8%ED%8A%B8/17316211
  7. https://m.blog.naver.com/paradice29/50184565199