Trong khôi phục cập nhật trì hoãn, các sửa đổi cơ sở dữ liệu thực tế trên đĩa được trì hoãn cho đến khi giao dịch commit. Cập nhật chỉ được ghi lại trong log và bộ đệm cache trong quá trình thực thi. Nếu giao dịch thất bại trước khi commit, cơ sở dữ liệu trên đĩa không bị ảnh hưởng — do đó NO-UNDO. Chỉ REDO được cần cho các giao dịch đã commit mà thay đổi của chúng chưa được ghi vào đĩa.
Giao thức cập nhật trì hoãn
- Một giao dịch không thể sửa đổi cơ sở dữ liệu trên đĩa cho đến khi nó đạt điểm commit.
- Tất cả các mục log REDO phải được ghi buộc lên đĩa trước khi commit (Write-Ahead Logging).
- Chỉ cần các mục log REDO (giá trị mới/AFIM) — không cần mục UNDO.
Thủ tục khôi phục (RDU_M)
Đối với hệ thống đa người dùng với khóa hai giai đoạn nghiêm ngặt, thuật toán khôi phục duy trì hai danh sách:
- Danh sách commit: Các giao dịch đã commit kể từ checkpoint cuối cùng.
- Danh sách hoạt động: Các giao dịch vẫn đang hoạt động (chưa commit).
REDO được áp dụng cho các hoạt động WRITE của giao dịch đã commit theo thứ tự log. Các giao dịch hoạt động (chưa commit) thực tế bị hủy và phải được gửi lại.
Ví dụ timeline
Checkpoint (t1) → Crash (t2)
T1 (đã commit) → T2 → REDO → T3 → REDO → T4 → Bỏ qua (không commit) → T5 → Bỏ qua (không commit)
T1 commit trước checkpoint — không cần redo. T2, T3 commit sau checkpoint phải redo. T4, T5 chưa bao giờ commit — bỏ qua (không có thay đổi trên đĩa dưới cập nhật trì hoãn).
Tối ưu hóa REDO
Nếu mục X được cập nhật nhiều lần bởi các giao dịch đã commit, chỉ cập nhật cuối cùng cần được redo:
- Duyệt log theo thứ tự ngược.
- Duy trì danh sách các mục đã redo.
- Bỏ qua các mục đã có trong danh sách (giá trị cuối cùng đã khôi phục).
- REDO chỉ các mục chưa có trong danh sách, sau đó thêm chúng vào.
Ưu và nhược điểm
| Ưu điểm | Nhược điểm |
|---|---|
| Không cần rollback khi thất bại (NO-UNDO) | Mục bị khóa ghi giữ khóa cho đến commit |
| Không có cascading rollbacks (mục khóa cho đến commit) | Yêu cầu không gian bộ đệm cho tất cả cập nhật cho đến commit |
| Giao dịch abgebort chỉ cần gửi lại | Chỉ thực tế cho giao dịch ngắn với ít thay đổi |
Kết luận
NO-UNDO/REDO cập nhật trì hoãn trì hoãn ghi đĩa cho đến commit, loại bỏ nhu cầu các hoạt động UNDO trong khôi phục. Chỉ các giao dịch đã commit sau checkpoint cuối cùng cần REDO. Điều này đơn giản hóa khôi phục nhưng giới hạn đồng thời và yêu cầu không gian bộ đệm đủ lớn để giữ tất cả thay đổi chưa commit.