Các phương thức truy cập chỉ cách đọc kèo bóng đá phải xử lý các bản cập nhật đồng thời của chỉ cách đọc kèo bóng đá bằng nhiều quy trình. LõiPostgreSQLHệ thống có đượcAccessSharelock
Trên chỉ cách đọc kèo bóng đá trong quá trình quét chỉ cách đọc kèo bóng đá vàRowExclusiveLock
Khi cập nhật chỉ cách đọc kèo bóng đá (bao gồm cả đơn giảnNút hút
). Vì các loại khóa này không xung đột, phương pháp truy cập chịu trách nhiệm xử lý bất kỳ khóa hạt mịn nào mà nó có thể cần.Access Exclusive
Khóa trên toàn bộ chỉ cách đọc kèo bóng đá sẽ chỉ được thực hiện trong quá trình tạo chỉ cách đọc kèo bóng đá, phá hủy hoặcReindex
(Cập nhật chia sẻ độc quyền
được lấy thay vào đó vớiđồng thời
).
Xây dựng một loại chỉ cách đọc kèo bóng đá hỗ trợ các bản cập nhật đồng thời thường yêu cầu phân tích sâu rộng và tinh tế về hành vi cần thiết. Đối với các loại chỉ cách đọc kèo bóng đá b-cây và băm, bạn có thể đọc về các quyết định thiết kế liên quan đếnsrc/backend/access/nbtree/readme
vàsrc/backend/access/băm/readme
.
Ngoài các yêu cầu tính nhất quán nội bộ của chỉ cách đọc kèo bóng đá, các bản cập nhật đồng thời tạo ra các vấn đề về tính nhất quán giữa bảng cha (Theheap) và chỉ cách đọc kèo bóng đá. Bởi vìPostgreSQLtách các truy cập và cập nhật của đống với các chỉ cách đọc kèo bóng đá, có các cửa sổ trong đó chỉ cách đọc kèo bóng đá có thể không phù hợp với đống. Chúng tôi xử lý vấn đề này với các quy tắc sau:
Một cách đọc kèo bóng đá nhập đống mới được thực hiện trước khi thực hiện các cách đọc kèo bóng đá nhập chỉ cách đọc kèo bóng đá của nó. .Phần 63.5.)
Khi một cách đọc kèo bóng đá nhập đống sẽ bị xóa (bởiNút hút
), tất cả các cách đọc kèo bóng đá nhập chỉ cách đọc kèo bóng đá của nó phải được xóa trước.
Quét chỉ cách đọc kèo bóng đá phải duy trì mã PIN trên trang chỉ cách đọc kèo bóng đá giữ cách đọc kèo bóng đá cuối cùng được trả về bởiAmgettuple
vàAmbulkdelete
Không thể xóa các cách đọc kèo bóng đá từ các trang được ghim bởi các phụ trợ khác. Nhu cầu về quy tắc này được giải thích bên dưới.
Không có quy tắc thứ ba, người đọc chỉ cách đọc kèo bóng đá có thể thấy cách đọc kèo bóng đá nhập chỉ cách đọc kèo bóng đá ngay trước khi nó bị xóa bởiNút hút
, và sau đó đến cách đọc kèo bóng đá nhập đống tương ứng sau đó đã bị xóa bởiVACUUM
. Điều này không tạo ra vấn đề nghiêm trọng nào nếu số mặt hàng đó vẫn không được sử dụng khi người đọc đạt được nó, vì một khe trống sẽ bị bỏ qua bởiheap_fetch ()
. Nhưng điều gì sẽ xảy ra nếu một phụ trợ thứ ba đã sử dụng lại khe cắm vật phẩm cho một thứ khác?Snapshotany
), có thể chấp nhận và trả lại một hàng không thực tế khớp với các phím quét. Chúng tôi có thể bảo vệ chống lại kịch bản này bằng cách yêu cầu các khóa quét phải được kiểm tra lại đối với hàng đống trong mọi trường hợp, nhưng điều đó quá đắt.Trong chuyến bayHồiTừ cách đọc kèo bóng đá nhập chỉ cách đọc kèo bóng đá đến cách đọc kèo bóng đá nhập đống phù hợp. LàmAmbulkdelete
Block on a pin như vậy đảm bảo rằngVACUUM
Không thể xóa cách đọc kèo bóng đá nhập đống trước khi người đọc hoàn thành nó. Giải pháp này có giá rất ít trong thời gian chạy và chỉ thêm khối lượng chặn trong những trường hợp hiếm hoi thực sự có xung đột.
Giải pháp này yêu cầu chỉ số quét làđồng bộHồi: Chúng ta phải tìm nạp từng đống ngay sau khi quét cách đọc kèo bóng đá nhập chỉ cách đọc kèo bóng đá tương ứng. Điều này là đắt tiền vì một số lý do.Mạnhkhông đồng bộKhăn14920_15282
trong mộtAmgetbitmap
SCAN INDEX, Phương thức truy cập không giữ chân chỉ cách đọc kèo bóng đá trên bất kỳ bộ dữ liệu nào được trả về. Do đó, chỉ an toàn khi sử dụng các lần quét như vậy với ảnh chụp nhanh tuân thủ MVCC.
KhiAmpredlocks
cờ không được đặt, bất kỳ lần quét nào sử dụng phương thức truy cập chỉ cách đọc kèo bóng đá đó trong giao dịch có thể nối tiếp sẽ có được khóa dự đoán không chặn trên toàn bộ chỉ cách đọc kèo bóng đá. Điều này sẽ tạo ra một cuộc xung đột đọc-viết với việc chèn bất kỳ tuple nào vào chỉ số đó bằng một giao dịch có thể nối tiếp đồng thời.