SQLSERVER - Transaction log file trong SQL Server dùng để ghi lại các
thay đổi xảy ra trong database. Quá trình này diễn ra như sau: đầu tiên
khi có một sự thay đổi data như Insert, Update, Delete được yêu cầu từ
các ứng dụng, SQL Server sẽ tải (load) data page tương ứng lên memory
(vùng bộ nhớ này gọi là data cache), sau đó data trong data cache được
thay đổi(những trang bị thay đổi còn gọi là dirty-page).
Tiếp theo mọi sự thay đổi đều được ghi vào transaction log file cho nên người ta gọi là write-ahead log. Cuối cùng thì một quá trình gọi là Check Point Process sẽ kiểm tra và viết tất cả những transaction đã được commited (hoàn tất) vào dĩa cứng (flushing the page).
Ngoài Check Point Process những dirty-page còn được đưa vào dĩa bởi một Lazy writer.
Ðây là một anh chàng làm việc âm thầm chỉ thức giấc và quét qua phần
data cache theo một chu kỳ nhất định sau đó lại ngủ yên chờ lần quét
tới.
Xin giải thích thêm một chút về khái niệm transaction trong database.
Một transaction hay một giao dịch là một loạt các hoạt động xảy ra được
xem như một công việc đơn (unit of work) nghĩa là hoặc thành công toàn
bộ hoặc không làm gì cả (all or nothing). Sau đây là một ví dụ cổ điển
về transaction:
Chúng ta muốn chuyển một số tiền $500 từ account A sang
account B như vậy công việc này cần làm các bước sau:
- Trừ $500 từ account A
- Cộng $500 vào account B
Tuy nhiên việc chuyển tiền trên phải được thực hiện dưới dạng một
transaction nghĩa là giao dịch chỉ được xem là hoàn tất (commited) khi
cả hai bước trên đều thực hiện thành công. Nếu vì một lý do nào đó ta
chỉ có thể thực hiện được bước 1 (chẳng hạn như vừa xong bước 1 thì điện
cúp hay máy bị treo) thì xem như giao dịch không hoàn tất và cần phải
được phục hồi lại trạng thái ban đầu (roll back).
Thế thì Check Point Process hoạt động như thế nào để có thể đảm bảo một transaction được thực thi mà không làm "dơ" database.
Trong hình vẽ trên, một transaction được biểu diễn bằng một mũi tên.
Trục nằm ngang là trục thời gian. Giả sử một Check Point được đánh dấu
vào thời điểm giữa transaction 2 và 3 như hình vẽ và sau đó sự cố xãy ra
trước khi gặp một Check point kế tiếp. Như vậy khi SQL Server được
restart nó sẽ dựa trên những gì ghi trong transaction log file để phục
hồi data (xem hình vẽ).
Ðiều đó có nghĩa là SQL Server sẽ không cần làm gì cả đối với
transaction 1 vì tại thời điểm Check point data đã được lưu vào dĩa rồi.
Trong khi đó transaction 2 và 4 sẽ được roll forward vì tuy đã được
commited nhưng do sự cố xảy ra trước thời điểm check point kế tiếp nên
data chưa kịp lưu vào dĩa. Tức là dựa trên những thông tin được ghi trên
log file SQL Server hoàn toàn có đầy đủ cơ sở để viết vào dĩa cứng. Còn
transaction 3 và 5 thì chưa được commited (do bị down bất ngờ) cho nên
SQL Server sẽ roll back hai transaction này dựa trên những gì được ghi
trên log file.