Sự không nhất quán trong việc đọc lặp lại


10

http://www.postgresql.org/docs/9.2/static/transaction-iso.html

Chế độ Đọc lặp lại cung cấp một đảm bảo nghiêm ngặt rằng mỗi giao dịch sẽ thấy chế độ xem hoàn toàn ổn định của cơ sở dữ liệu. Tuy nhiên, quan điểm này không nhất thiết phải luôn luôn nhất quán với một số thực thi nối tiếp (từng lúc một) của các giao dịch đồng thời cùng cấp. Ví dụ: ngay cả một giao dịch chỉ đọc ở cấp độ này có thể thấy một bản ghi kiểm soát được cập nhật để cho thấy rằng một lô đã được hoàn thành nhưng không thấy một trong các bản ghi chi tiết là một phần hợp lý của lô vì nó đọc bản sửa đổi trước đó của bản ghi kiểm soát . Nỗ lực thực thi các quy tắc kinh doanh bằng các giao dịch chạy ở mức cô lập này không có khả năng hoạt động chính xác nếu không sử dụng cẩn thận các khóa rõ ràng để chặn các giao dịch xung đột.

Không phải là đọc ảo, điều này là không thể trong chế độ đọc lặp lại?

Tài liệu nói rằng một truy vấn trong giao dịch đọc lặp lại nhìn thấy một ảnh chụp nhanh khi bắt đầu giao dịch, vậy thì làm thế nào để một truy vấn có thể đọc dữ liệu không nhất quán?

Câu trả lời:


5

Đây là bài đọc của tôi về phần đó. Tôi sẽ thừa nhận nó là khó hiểu.

Giả sử tôi có hai bảng:

CREATE TABLE batch (
   id serial not null unique,
   control_code text primary key,
   date_posted date not null default now()
);

CREATE TABLE details (
   batch_id int not null references batch(id),
   description text,
   primary key(batch_id, description)
);

Bây giờ, giả sử chúng tôi chèn lô và hồ sơ chi tiết trong các giao dịch khác nhau. Phần 1 chèn một lô và bắt đầu chèn chi tiết nhưng trước khi kết thúc, phiên 2 sẽ khởi động. Phần 2 sẽ xem thông tin tiêu đề hàng loạt, nhưng không chờ cam kết về chi tiết để thông báo cho người dùng rằng không tìm thấy hồ sơ. Bây giờ nếu lô và chi tiết của bạn hoàn toàn trong cùng một giao dịch thì điều này không bao giờ là vấn đề.

điều này sẽ khác với tuần tự hóa nơi bạn muốn đợi phần chèn trước hoàn thành và cam kết hoặc khôi phục trước khi xác định có thông báo cho người dùng rằng không tìm thấy hàng nào không.


3

một tài liệu trong PostgreQuery Wiki cho thấy một số vấn đề có thể xảy ra với một số kết hợp giao dịch nhất định ở cấp độ cách ly giao dịch REPEATABLE READ và cách chúng được tránh ở cấp độ cách ly giao dịch SERIALIZABLE bắt đầu với phiên bản PostgreQuery 9.1.

Nó cũng bao gồm một ví dụ về cách có thể có thể cho một giao dịch CHỈ ĐỌC ở mức ĐỌC LẠI để đọc dữ liệu không nhất quán.


@dezso Bạn có thể quan tâm đến điều đó
907

1

Đọc ma (chắc chắn không nhầm lẫn điều này với đọc không lặp lại) có thể ở mức cô lập "Đọc lặp lại" ... về nguyên tắc. Nhưng hành vi thực tế của Postgresql khi bạn chọn "Đọc lặp lại" mạnh hơn so với tiêu chuẩn, (gần như là cách ly "Nối tiếp"), do đó, thực tế là bạn sẽ không đọc được ảo. Tài liệu :

Khi bạn chọn cấp độ Đọc không được chấp nhận, bạn thực sự nhận được Cam kết và việc đọc ảo không thể thực hiện được trong quá trình thực hiện PostgreQuery của Đọc lặp lại , do đó mức cô lập thực tế có thể nghiêm ngặt hơn mức bạn chọn.

Bây giờ, những gì về cảnh báo đó "quan điểm này không nhất thiết phải luôn luôn phù hợp với một số thực thi nối tiếp (từng cái một) của các giao dịch đồng thời cùng cấp"? Tôi nghĩ (tôi không chắc) điều đó có nghĩa là điều đó có nghĩa là ảnh chụp nhanh "từ bên ngoài" (cố định khi bắt đầu giao dịch) cuối cùng có thể bao gồm các hàng từ các giao dịch khác nhưng không bao gồm một số hàng khác từ cùng một giao dịch.

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.