Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

52,5. Chỉ kèo bóng đá cúp c2 kiểm tra tính duy nhất

PostgreSQLThực thi SQL Các ràng buộc kèo bóng đá cúp c2 độc đáo bằng cách sử dụngĐộc đáo chỉ kèo bóng đá cúp c2, là những chỉ kèo bóng đá cúp c2 không cho phép nhiều kèo bóng đá cúp c2 với các khóa giống hệt nhau. Một phương thức truy cập hỗ trợ tính năng này đặtpg_am.AmcanuniqueĐúng. (Hiện tại, chỉ có B-Tree hỗ trợ nó.)

Vì MVCC, luôn luôn cần phải cho phép trùng lặp Các kèo bóng đá cúp c2 nhập tồn tại về mặt vật lý trong một chỉ kèo bóng đá cúp c2: các kèo bóng đá cúp c2 có thể tham khảo đến các phiên bản liên tiếp của một hàng logic duy nhất. Hành vi chúng tôi thực sự muốn thực thi là không có ảnh chụp nhanh MVCC nào có thể bao gồm Hai hàng với các phím chỉ số bằng nhau. Điều này bị phá vỡ vào Các trường hợp sau phải được kiểm tra khi chèn một hàng mới thành một chỉ kèo bóng đá cúp c2 duy nhất:

  • Nếu một hàng hợp lệ xung đột đã bị xóa bởi hiện tại Giao dịch, không sao cả. (Đặc biệt, kể từ khi cập nhật Luôn xóa phiên bản hàng cũ trước khi chèn phiên bản, điều này sẽ cho phép một bản cập nhật trên một hàng mà không cần thay đổi khóa.)

  • Nếu một hàng xung đột đã được chèn bởi một giao dịch khi được cam kết, mà người đưa vào phải Đợi xem giao dịch đó có cam kết không. Nếu nó quay trở lại Sau đó không có xung đột. Nếu nó cam kết mà không xóa Hàng xung đột một lần nữa, có một vi phạm độc đáo. (TRONG Thực hành chúng tôi chỉ chờ giao dịch khác kết thúc và sau đó làm lại kèo bóng đá cúp c2 khả năng hiển thị trong toto.)

  • Tương tự, nếu một hàng hợp lệ xung đột đã bị xóa bởi một giao dịch chưa có cam kết, người sẽ phải là chờ giao dịch đó cam kết hoặc hủy bỏ, sau đó lặp lại bài kèo bóng đá cúp c2.

Hơn nữa, ngay trước khi báo cáo tính độc đáo vi phạm theo các quy tắc trên, phương pháp truy cập phải kèo bóng đá cúp c2 lại sự sống của hàng được chèn. Nếu nó là đã chết sau đó không có vi phạm nên được báo cáo. (Trường hợp này không thể xảy ra trong kịch bản thông thường để chèn một hàng Đó chỉ được tạo ra bởi giao dịch hiện tại. Nó có thể xảy ra trongTạo chỉ kèo bóng đá cúp c2 duy nhất Đồng thời, tuy nhiên.)

Chúng tôi yêu cầu phương thức truy cập chỉ kèo bóng đá cúp c2 để áp dụng các thử nghiệm này chính nó, có nghĩa là nó phải chạm vào đống để kiểm tra Trạng thái cam kết của bất kỳ hàng nào được hiển thị có khóa trùng lặp Theo nội dung chỉ số. Điều này chắc chắn là xấu xí và không mô-đun, nhưng nó tiết kiệm công việc dư thừa: nếu chúng ta làm riêng thăm dò sau đó tìm kiếm chỉ kèo bóng đá cúp c2 cho một hàng mâu thuẫn sẽ là về cơ bản lặp đi lặp lại trong khi tìm nơi chèn kèo bóng đá cúp c2 nhập chỉ kèo bóng đá cúp c2 của hàng. Hơn nữa, không có cách nào rõ ràng để tránh điều kiện chủng tộc trừ khi kiểm tra xung đột là một phần không thể thiếu của Lắp kèo bóng đá cúp c2 nhập chỉ kèo bóng đá cúp c2 mới.

Nếu ràng buộc duy nhất là có thể bảo vệ, có thêm Sự phức tạp: Chúng ta cần có khả năng chèn một kèo bóng đá cúp c2 nhập chỉ kèo bóng đá cúp c2 cho một kèo bóng đá cúp c2 mới hàng, nhưng trì hoãn mọi lỗi vi phạm duy nhất cho đến khi kết thúc tuyên bố hoặc thậm chí sau này. Để tránh các tìm kiếm lặp lại không cần thiết của chỉ kèo bóng đá cúp c2, phương thức truy cập chỉ kèo bóng đá cúp c2 nên thực hiện sơ bộ Kiểm tra tính duy nhất trong quá trình chèn ban đầu. Nếu điều này cho thấy rằng Chắc chắn không có tuple trực tiếp mâu thuẫn, chúng tôi đã hoàn thành. Nếu không, chúng tôi lên lịch kiểm tra lại xảy ra khi đến lúc thực thi các ràng buộc. Nếu, tại thời điểm kiểm tra lại, cả hai chèn tuple và một số tuple khác có cùng một khóa được sống, sau đó lỗi phải được báo cáo. (Lưu ý rằng với kèo bóng đá cúp c2 đích này,"Live"thực tế có nghĩa là"Bất kỳ tuple nào trong chuỗi nóng của kèo bóng đá cúp c2 nhập chỉ kèo bóng đá cúp c2 là sống".) Để thực hiện điều này,AminsertHàm được truyền ACheckuniqueTham số có một trong những điều sau đây Giá trị:

  • độc đáo_check_nochỉ ra rằng không Kiểm tra tính độc đáo nên được thực hiện (đây không phải là một chỉ kèo bóng đá cúp c2).

  • độc đáo_check_yeschỉ ra rằng Đây là một chỉ số độc đáo không thể thực hiện được và sự độc đáo kèo bóng đá cúp c2 phải được thực hiện ngay lập tức, như được mô tả ở trên.

  • độc đáo_check_partialchỉ ra rằng ràng buộc duy nhất là có thể thu hồi được.PostgreSQLSẽ sử dụng chế độ này để chèn mỗi kèo bóng đá cúp c2 nhập chỉ kèo bóng đá cúp c2 của hàng. Phương thức truy cập phải cho phép trùng lặp các kèo bóng đá cúp c2 vào chỉ kèo bóng đá cúp c2 và báo cáo bất kỳ tiềm năng nào sao chép bằng cách trả về false từAminsert. Cho mỗi hàng mà sai là Trả lại, một kèo bóng đá cúp c2 lại hoãn lại sẽ được lên lịch.

    Phương thức truy cập phải xác định bất kỳ hàng nào có thể vi phạm các ràng buộc duy nhất, nhưng nó không phải là một lỗi cho nó để báo cáo dương tính giả. Điều này cho phép kèo bóng đá cúp c2 được thực hiện mà không chờ đợi các giao dịch khác kết thúc; xung đột báo cáo ở đây không được coi là lỗi và sẽ được kèo bóng đá cúp c2 lại sau này, vào thời điểm đó họ có thể không còn là xung đột nữa.

  • độc đáo_check_existingchỉ ra rằng đây là một việc kèo bóng đá cúp c2 lại một hàng đã được báo cáo là một vi phạm độc đáo tiềm năng. Mặc dù đây là được thực hiện bằng cách gọiAminsert, Phương thức truy cập phảikhôngChèn một cái mới kèo bóng đá cúp c2 nhập chỉ kèo bóng đá cúp c2 trong trường hợp này. kèo bóng đá cúp c2 nhập chỉ kèo bóng đá cúp c2 đã có mặt. Thay vào đó, phương pháp truy cập phải kiểm tra xem liệu có Một kèo bóng đá cúp c2 nhập chỉ kèo bóng đá cúp c2 trực tiếp khác. Nếu vậy, và nếu hàng kèo bóng đá cúp c2 tiêu là cũng vẫn còn sống, báo cáo lỗi.

    khuyến nghị rằng trong Ađộc đáo_check_existingGọi, Phương thức truy cập xác minh thêm rằng hàng kèo bóng đá cúp c2 tiêu thực sự có kèo bóng đá cúp c2 nhập hiện tại trong chỉ kèo bóng đá cúp c2 và báo cáo lỗi nếu không. Đây là một ý tưởng tốt vì các giá trị tple chỉ kèo bóng đá cúp c2 được truyền choAminsertsẽ có tính toán lại. Nếu định nghĩa chỉ số liên quan đến các chức năng không thực sự bất biến, chúng tôi có thể kiểm tra sai khu vực của chỉ số. Kiểm tra xem hàng kèo bóng đá cúp c2 tiêu có được tìm thấy trong Kiểm tra lại xác minh rằng chúng tôi đang quét cho cùng một bộ các giá trị như đã được sử dụng trong chèn ban đầu.