Giao dịch và thống nhất dữ liệu trong một thất bại


7

Khi cơ sở dữ liệu bắt đầu một giao dịch, tất cả các câu lệnh được thực hiện trong giao dịch đó đều bị cô lập và nguyên tử (và nhất quán và bền vững). Đây là khá nhiều định nghĩa của một giao dịch.

Wikipedia nói rằng có một số cơ sở dữ liệu đảm bảo giao dịch vẫn bị cô lập bằng cách khóa các hàng và không mở khóa cho đến khi giao dịch được thực hiện.

Câu hỏi của tôi là: Làm thế nào một cơ sở dữ liệu chỉ dựa vào tính nhất quán bảo đảm khóa? Nếu mất điện xảy ra giữa giao dịch, có thể có dữ liệu được ghi một phần vào hàng.

Ngay cả đối với các cơ sở dữ liệu như SQL Server sử dụng DB tạm thời để thực hiện tất cả các giao dịch, điều gì xảy ra nếu mất điện xảy ra khi cơ sở dữ liệu đang thực hiện các giao dịch vào đĩa?

Dữ liệu có bị hỏng hay cơ sở dữ liệu xử lý chính xác không?

Câu trả lời:


13

Chịu đựng tôi, đây là một câu hỏi phức tạp để làm rõ và chúng tôi có thể trải qua một vài vòng chỉnh sửa và bình luận để cắm các khoảng trống. Từ cách đặt câu hỏi của bạn, tôi đoán bạn không phân biệt các yếu tố nguyên tử, sự cô lập, tính nhất quán và độ bền của ACID.

Khi cơ sở dữ liệu bắt đầu một giao dịch, tất cả các câu lệnh được thực hiện trong giao dịch đó đều bị cô lập và nguyên tử (và nhất quán và bền vững). Đây là khá nhiều định nghĩa của một giao dịch.

Phần cô lập của ACID bị hiểu lầm rộng rãi. Có một mức độ mà các giao dịch được cách ly với nhau, như được xác định bởi mức độ cô lập giao dịch. Các yếu tố khác của ACID là tuyệt đối.

Wikipedia nói rằng có một số cơ sở dữ liệu đảm bảo giao dịch vẫn bị cô lập bằng cách khóa các hàng và không mở khóa cho đến khi giao dịch được thực hiện.

Điều này liên quan đến phần cô lập của ACID, nó không có bất kỳ tác động nào đến câu hỏi chính của bạn.

Câu hỏi của tôi là: Làm thế nào một cơ sở dữ liệu chỉ dựa vào tính nhất quán bảo đảm khóa? Nếu mất điện xảy ra giữa giao dịch, có thể có dữ liệu được ghi một phần vào hàng.

Ví dụ của bạn không liên quan đến tính nhất quán, đó là độ bền và tính nguyên tử. Đây là những đảm bảo bằng cách viết nhật ký trước (WAL). Với WAL, tất cả các thay đổi được ghi vào nhật ký hoàn tác / làm lại trước khi chúng được áp dụng cho dữ liệu.

Trong trường hợp mất điện, quy trình khôi phục sẽ được chạy để đọc nhật ký để xác định a) giao dịch "giữa chuyến bay" không cam kết và b) giao dịch đã cam kết nhưng không được áp dụng cho dữ liệu. Các thay đổi từ a) giao dịch được hoàn tác (khôi phục), trả lại dữ liệu về trạng thái trước giao dịch. Các thay đổi từ b) được làm lại (chuyển tiếp), đảm bảo dữ liệu ở trạng thái sau giao dịch dự kiến.

Ngay cả đối với các cơ sở dữ liệu như SQL Server sử dụng DB tạm thời để thực hiện tất cả các giao dịch, điều gì xảy ra nếu mất điện xảy ra khi cơ sở dữ liệu đang thực hiện các giao dịch vào đĩa?

TempDB (giả sử đó là những gì bạn đang đề cập) hoàn toàn không liên quan gì đến việc thực hiện các giao dịch của Máy chủ SQL. Bạn có nhầm lẫn vai trò của TempDB trong các mức cô lập ảnh chụp không?


+1 Xuất sắc. Liên kết ghi nhật ký viết trước lấp đầy rất nhiều khoảng trống và rất có ý nghĩa. Bạn nói đúng về tôi nhầm lẫn TempDB và các mức cô lập. Tôi sẽ nghiên cứu thêm về lĩnh vực đó. Cảm ơn nhiều!
Richard

và nếu có sự cố mất điện khác khi cơ sở dữ liệu đang chạy nhật ký hoàn tác / làm lại thì sao?
Ike

@Ike Điều tương tự lại xảy ra.
Mark Storey-Smith
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.