Nếu một giao dịch được cam kết, thì nó có được lưu không?


12

Nếu một giao dịch được thực hiện thành công, tôi có thể chắc chắn 100% rằng nó đã được ghi vào cơ sở dữ liệu VÀ vào các tệp nhật ký không? Tôi có thể chắc chắn rằng dữ liệu được SAVED không?

Hôm nay các tệp nhật ký của chúng tôi đã đạt đến giới hạn của ổ đĩa và chúng tôi đã gặp rất nhiều lỗi. Hơn nữa, một số dịch vụ khác bị rơi. Chúng tôi tăng đĩa và khởi động lại máy chủ.

Trong quá trình khởi động, máy chủ đã thực hiện "phục hồi cơ sở dữ liệu" - tôi có thể chắc chắn rằng mọi thứ đã ổn trở lại không?


2
Bạn có thể kiểm tra nhật ký lỗi sau khi khôi phục hoàn tất để xem có bao nhiêu giao dịch đã được thực hiện và bao nhiêu giao dịch đã được khôi phục. Không có câu trả lời kỳ diệu nào cho vấn đề này - nếu một đĩa bị hỏng thì tất cả phụ thuộc vào trạng thái của các giao dịch tại thời điểm đó.
Aaron Bertrand

1
@AaronBertrand Nhưng nếu một giao dịch ở trạng thái "đã cam kết" (nghĩa là cam kết đã thành công), thì làm sao có thể nó vẫn bị mất trong quá trình phục hồi?
Cảnh sát SQL

3
@Giosco: Không thể. "Cam kết" có nghĩa là nó nằm trong tệp nhật ký của cơ sở dữ liệu. Cách duy nhất để mất nó sau đó là 1) mất tệp nhật ký trước khi nó cũng được lưu vào tệp dữ liệu hoặc 2) mất cả tệp nhật ký và tệp dữ liệu hoặc 3) lỗi của con người. Lưu ý rằng (3) thường là dễ thương nhất.
RBarryYoung

2
@Giosco làm thế nào để bạn biết rằng tất cả các giao dịch của bạn tại thời điểm ổ đĩa đầy đủ đã được cam kết thành công?
Aaron Bertrand

2
Thủ tục được lưu trữ <> giao dịch - thủ tục được lưu trữ của bạn có thể có nhiều giao dịch rõ ràng hoặc chỉ ẩn, có thể có logic thử / bắt, có thể xử lý giao dịch ở lớp C #, v.v. Một lần nữa, giả sử rằng không có ngoại lệ = cam kết thành công có thể là một chút quá nguy hiểm như một tuyên bố chăn.
Aaron Bertrand

Câu trả lời:


16

Nếu một ứng dụng khách đã phát hành một CAM KẾT và nhận lại mã thành công thì giao dịch được đảm bảo bởi động cơ sẽ bền. Nó được đảm bảo rằng tất cả các thay đổi được thực hiện trong một giao dịch sẽ được hiển thị, ngay cả sau khi gặp sự cố. Hơn nữa, việc khôi phục cũng đảm bảo rằng mọi giao dịch không được cam kết sẽ được khôi phục trong trường hợp xảy ra sự cố.

Để biết thêm chi tiết, tôi khuyên bạn nên đọc bài báo ARIES .

Ghi nhật ký và khôi phục viết trước không thể đảm bảo nếu phần cứng lưu trữ bên dưới có lỗi (hỏng). Và bất kỳ sản phẩm kỹ thuật có thể chứa khiếm khuyết.

Ứng dụng của bạn, giống như tất cả các ứng dụng khác, cần được viết cẩn thận để hành xử chính xác khi có sự cố (lỗi). Không có phép thuật.


Nếu một ứng dụng khách đã ban hành một CAM KẾT nhưng không nhận được phản hồi từ DB cho đến khi hết thời gian ở phía máy khách. Điều gì về cam kết này? thành công hay thất bại? Làm thế nào để kiểm tra?
Gab 是
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.