Postgresql 8.3.23 Tài liệu | ||||
---|---|---|---|---|
Prev | Backward nhanh | Chương 13. Điều khiển đồng thời | Chuyển tiếp nhanh | Tiếp theo |
PostgreSQLcung cấp nhiều Các chế độ kèo bóng đá cúp c2 để kiểm soát truy cập đồng thời vào dữ liệu trong các bảng. Những cái này các chế độ có thể được sử dụng để kèo bóng đá cúp c2 do ứng dụng kiểm soát tình huống trong đóMVCCKhông đưa ra hành vi mong muốn. Ngoài ra, hầu hếtPostgreSQLlệnh tự động có được kèo bóng đá cúp c2 các chế độ thích hợp để đảm bảo rằng các bảng được tham chiếu là không bị bỏ hoặc sửa đổi theo những cách không tương thích trong khi lệnh thực thi. (Ví dụ,Bảng thay đổiKhông thể được thực hiện đồng thời với các hoạt động khác trên cùng một bảng, vì vậy nó có được một kèo bóng đá cúp c2 độc quyền trên bảng để thực thi điều đó.)
Để kiểm tra danh sách các kèo bóng đá cúp c2 hiện đang nổi bật trong A trong A Máy chủ cơ sở dữ liệu, sử dụngpg_locksChế độ xem hệ thống. Để biết thêm thông tin Khi theo dõi trạng thái của hệ thống con Trình quản lý kèo bóng đá cúp c2, hãy tham khảoChương 26.
Danh sách bên dưới hiển thị các chế độ kèo bóng đá cúp c2 có sẵn và bối cảnh mà chúng được sử dụng tự động bởiPostgreSQL. Bạn cũng có thể có được bất kỳ các kèo bóng đá cúp c2 này một cách rõ ràng với lệnhkèo bóng đá cúp c2. Hãy nhớ rằng tất cả các chế độ kèo bóng đá cúp c2 này là kèo bóng đá cúp c2 cấp bảng, ngay cả khi tên chứa từ"hàng"; tên của các chế độ kèo bóng đá cúp c2 là lịch sử. Ở một mức độ nào đó, các tên phản ánh điển hình Việc sử dụng từng chế độ kèo bóng đá cúp c2 - nhưng ngữ nghĩa đều giống nhau. Sự khác biệt thực sự duy nhất giữa chế độ kèo bóng đá cúp c2 này và một chế độ khác là tập hợp các chế độ kèo bóng đá cúp c2 mà mỗi xung đột (xemBảng 13-2). . Hai giao dịch không thể giữ các kèo bóng đá cúp c2 mâu thuẫn chế độ trên cùng một bảng cùng một lúc. (Tuy nhiên, a Giao dịch không bao giờ xung đột với chính nó. Ví dụ, nó có thể giành đượcAccess Exclusivekèo bóng đá cúp c2 và sau đó có đượcChia sẻ truy cậpkèo bóng đá cúp c2 trên Cùng một bảng.) Có thể giữ các chế độ kèo bóng đá cúp c2 không xung đột có thể được giữ đồng thời bởi nhiều giao dịch. Thông báo cụ thể rằng Một số chế độ kèo bóng đá cúp c2 là tự kết hợp (ví dụ:quyền truy cập độc quyềnkèo bóng đá cúp c2 không thể được giữ bởi nhiều hơn một giao dịch cùng một lúc) trong khi những người khác không Tự do (ví dụ:Truy cập CHIA SẺkèo bóng đá cúp c2 có thể được tổ chức bởi nhiều giao dịch).
chế độ kèo bóng đá cúp c2 cấp bảng
Xung đột vớiTruy cập LOẠI TRỪChỉ chế độ kèo bóng đá cúp c2.
TheChọnLệnh có được a kèo bóng đá cúp c2 của chế độ này trên các bảng được tham chiếu. Nói chung, bất kỳ truy vấn chỉ đọc một bảng và không sửa đổi nó sẽ có được chế độ kèo bóng đá cúp c2 này.
Xung đột vớiĐộc quyềnvàAccess Exclusivekèo bóng đá cúp c2 chế độ.
TheChọn để cập nhậtvàChọn chia sẻlệnh có được một kèo bóng đá cúp c2 chế độ này trên (các) bảng đích (trong bổ sung vàoChia sẻ truy cậpkèo bóng đá cúp c2 trên bất kỳ bảng nào khác được tham chiếu nhưng không được chọnđể cập nhật/để chia sẻ).
Xung đột vớichia sẻ, Chia sẻ độc quyền, Độc quyềnvàTruy cập LOẠI TRỪchế độ kèo bóng đá cúp c2.
Các lệnhCập nhật, XóavàChèncó được chế độ kèo bóng đá cúp c2 này trên Bảng mục tiêu (ngoàiTruy cập CHIA SẺkèo bóng đá cúp c2 trên bất kỳ bảng được tham chiếu nào khác). TRONG Chung, chế độ kèo bóng đá cúp c2 này sẽ được nhận bởi bất kỳ lệnh nào điều chỉnh dữ liệu trong bảng.
Xung đột vớiCập nhật chia sẻ LOẠI TRỪ, chia sẻ, Chia sẻ độc quyền, Độc quyềnvàTruy cập LOẠI TRỪchế độ kèo bóng đá cúp c2. Chế độ này bảo vệ một bảng chống lại sự thay đổi lược đồ đồng thời vàVACUUMChạy.
Được mua bởiNút hút(khôngFull),Phân tíchvàTạo Chỉ mục đồng thời.
Xung đột vớiHàng LOẠI TRỪ, Cập nhật chia sẻ LOẠI TRỪ, Chia sẻ hàng LOẠI TRỪ, Độc quyềnvàAccess Exclusivechế độ kèo bóng đá cúp c2. Chế độ này bảo vệ bảng chống lại dữ liệu đồng thời thay đổi.
Được mua bởiTạo chỉ mục(khôngđồng thời).
Xung đột vớiHàng LOẠI TRỪ, Cập nhật chia sẻ LOẠI TRỪ, chia sẻ, Chia sẻ độc quyền hàng, Độc quyềnvàTruy cập LOẠI TRỪchế độ kèo bóng đá cúp c2.
Chế độ kèo bóng đá cúp c2 này không được tự động mua bởi bất kỳ nàoPostgreSQLlệnh.
Xung đột vớiChia sẻ hàng, ROW ĐỘC QUYỀN, Cập nhật chia sẻ độc quyền, chia sẻ, Chia sẻ hàng LOẠI TRỪ, Độc quyềnvàAccess Exclusivechế độ kèo bóng đá cúp c2. Chế độ này chỉ cho phép đồng thờiChia sẻ truy cậpkèo bóng đá cúp c2, tức là chỉ đọc từ Bảng có thể tiến hành song song với một giao dịch giữ chế độ kèo bóng đá cúp c2 này.
Chế độ kèo bóng đá cúp c2 này không tự động có được trên người dùng bảng bởi bất kỳPostgreSQLLệnh. Tuy nhiên nó được mua trên một số hệ thống nhất định Danh mục trong một số hoạt động.
Xung đột với kèo bóng đá cúp c2 của tất cả các chế độ (Chia sẻ truy cập, Hàng CHIA SẺ, ROW ĐỘC QUYỀN, Cập nhật chia sẻ độc quyền, chia sẻ, Chia sẻ Hàng độc quyền, Độc quyền, VàAccess Exclusive). Chế độ này đảm bảo rằng chủ sở hữu là giao dịch duy nhất truy cập bảng theo bất kỳ cách nào.
Được mua bởiBảng thay đổi, BẢNG DROP, cắt ngắn, Reindex, cụm,, VàNút không đầy đủlệnh. Cái này cũng là chế độ kèo bóng đá cúp c2 mặc định choBảng kèo bóng đá cúp c2Câu không chỉ định một chế độ một cách rõ ràng.
Tip:chỉ mộtTruy cập LOẠI TRỪkèo bóng đá cúp c2 khối AChọn(khôngcho Cập nhật/Chia sẻ) tuyên bố.
Sau khi có được, một kèo bóng đá cúp c2 thường được giữ cho đến khi kết thúc giao dịch. Nhưng nếu một kèo bóng đá cúp c2 được mua sau khi thiết lập một savePoint, kèo bóng đá cúp c2 được phát hành ngay lập tức nếu điểm lưu là quay trở lại. Điều này phù hợp với nguyên tắcrollbackHủy bỏ tất cả các hiệu ứng của các lệnh kể từ điểm lưu. Điều tương tự cho các kèo bóng đá cúp c2 có được trong aPL/PGSQLNgoại lệ Khối: Một lỗi thoát ra khỏi khối phát hành kèo bóng đá cúp c2 đã thu được trong đó.
Bảng 13-2. Các chế độ kèo bóng đá cúp c2 mâu thuẫn
Chế độ kèo bóng đá cúp c2 được yêu cầu | Chế độ kèo bóng đá cúp c2 hiện tại | |||||||
---|---|---|---|---|---|---|---|---|
Chia sẻ truy cập | Chia sẻ hàng | ROW ĐỘC QUYỀN | Cập nhật chia sẻ độc quyền | chia sẻ | Chia sẻ độc quyền | Độc quyền | Access Exclusive | |
Chia sẻ truy cập | X | |||||||
Chia sẻ hàng | x | x | ||||||
ROW ĐỘC QUYỀN | x | x | x | X | ||||
Cập nhật chia sẻ độc quyền | x | X | x | x | x | |||
chia sẻ | x | x | X | x | x | |||
Chia sẻ độc quyền | x | x | X | x | x | x | ||
Độc quyền | x | x | X | x | x | x | x | |
Access Exclusive | x | x | x | X | x | x | x | x |
Ngoài các kèo bóng đá cúp c2 cấp bảng, còn có kèo bóng đá cúp c2 cấp hàng, có thể là kèo bóng đá cúp c2 độc quyền hoặc chia sẻ. Một cấp độ độc quyền kèo bóng đá cúp c2 trên một hàng cụ thể được tự động có được khi hàng được cập nhật hoặc xóa. kèo bóng đá cúp c2 được giữ cho đến khi giao dịch cam kết hoặc quay trở lại, theo cách tương tự như đối với cấp độ bảng kèo bóng đá cúp c2. kèo bóng đá cúp c2 cấp hàng không ảnh hưởng đến truy vấn dữ liệu; họ chặnNhà văn với cùng một hàng ngangchỉ.
Để có được kèo bóng đá cúp c2 cấp độ hàng độc quyền trên một hàng mà không có thực sự sửa đổi hàng, chọn hàng vớiChọn để cập nhật. Lưu ý rằng một khi cấp độ hàng kèo bóng đá cúp c2 được mua, giao dịch có thể cập nhật nhiều hàng thời gian không sợ xung đột.
Để có được kèo bóng đá cúp c2 cấp độ được chia sẻ trên một hàng, chọn hàng vớiChọn để chia sẻ. Một kèo bóng đá cúp c2 được chia sẻ không ngăn chặn các giao dịch khác có được kèo bóng đá cúp c2 được chia sẻ. Tuy nhiên, không có giao dịch nào được phép cập nhật, xóa hoặc kèo bóng đá cúp c2 độc quyền một hàng mà bất kỳ Giao dịch giữ một kèo bóng đá cúp c2 chia sẻ. Mọi nỗ lực để làm như vậy sẽ chặn cho đến khi (các) kèo bóng đá cúp c2 được chia sẻ đã được phát hành.
PostgreSQLKhông nhớ bất kỳ thông tin nào về các hàng đã sửa đổi trong bộ nhớ, vì vậy nó không có giới hạn số lượng hàng bị kèo bóng đá cúp c2 cùng một lúc. Tuy nhiên, kèo bóng đá cúp c2 một hàng có thể gây ra một đĩa ghi; Vì vậy, ví dụ,Chọn để cập nhậtSẽ sửa đổi đã chọn hàng để đánh dấu chúng bị kèo bóng đá cúp c2, và do đó sẽ dẫn đến đĩa Writes.
Ngoài kèo bóng đá cúp c2 bàn và hàng, cấp độ trang Chia sẻ/kèo bóng đá cúp c2 độc quyền được sử dụng để kiểm soát quyền truy cập đọc/ghi vào Bảng bảng trong nhóm bộ đệm được chia sẻ. Những ổ kèo bóng đá cúp c2 này được phát hành Ngay sau khi một hàng được tìm nạp hoặc cập nhật. Ứng dụng Các nhà phát triển thường không cần quan tâm đến mức độ kèo bóng đá cúp c2, nhưng chúng tôi đề cập đến chúng cho sự hoàn chỉnh.
Việc sử dụng kèo bóng đá cúp c2 rõ ràng có thể tăng khả năng củabế tắc, trong đó hai (hoặc nhiều hơn) Giao dịch mỗi kèo bóng đá cúp c2 giữ mà người kia muốn. Ví dụ, Nếu Giao dịch 1 có được kèo bóng đá cúp c2 độc quyền trên Bảng A và sau đó cố gắng để có được một kèo bóng đá cúp c2 độc quyền trên bảng B, trong khi Giao dịch 2 đã có bảng B và bây giờ được kèo bóng đá cúp c2 độc quyền muốn một kèo bóng đá cúp c2 độc quyền trên Bảng A, sau đó không ai có thể tiếp tục.PostgreSQLtự động phát hiện các tình huống bế tắc và giải quyết chúng bằng cách hủy bỏ một trong các giao dịch liên quan, cho phép (s) khác để hoàn thành. (Chính xác là giao dịch nào sẽ là bị hủy bỏ là khó dự đoán và không nên dựa vào TRÊN.)
Lưu ý rằng bế tắc cũng có thể xảy ra do kết quả của kèo bóng đá cúp c2 cấp độ hàng (và do đó, chúng có thể xảy ra ngay cả khi rõ ràng kèo bóng đá cúp c2 không được sử dụng). Xem xét trường hợp có hai Giao dịch đồng thời sửa đổi một bảng. Đầu tiên Thực thi giao dịch:
Cập nhật tài khoản đặt số dư = cân bằng + 100.00 trong đó acctnum = 11111;
Điều này có được kèo bóng đá cúp c2 cấp hàng trên hàng với quy định Số tài khoản. Sau đó, giao dịch thứ hai thực thi:
Cập nhật tài khoản đặt số dư = cân bằng + 100.00 trong đó acctnum = 22222; Cập nhật tài khoản đặt số dư = số dư - 100.00 trong đó acctnum = 11111;
Đầu tiênCập nhậtTuyên bố Có được thành công kèo bóng đá cúp c2 cấp độ hàng trên hàng được chỉ định, vì vậy Nó thành công trong việc cập nhật hàng đó. Tuy nhiên, thứ haiCập nhậtTuyên bố thấy rằng hàng nó đang cố gắng cập nhật đã bị kèo bóng đá cúp c2, vì vậy nó chờ đợi Đối với giao dịch có được kèo bóng đá cúp c2 để hoàn thành. Giao dịch hai hiện đang chờ giao dịch một để hoàn thành Trước khi nó tiếp tục thực hiện. Bây giờ, giao dịch một thực thi:
Cập nhật tài khoản đặt số dư = cân bằng - 100.00 trong đó acctnum = 22222;
Giao dịch Một cố gắng để có được kèo bóng đá cúp c2 cấp hàng trên Hàng được chỉ định, nhưng nó không thể: Giao dịch hai đã được tổ chức Thật là một kèo bóng đá cúp c2. Vì vậy, nó chờ giao dịch hai để hoàn thành. Như vậy, Giao dịch một bị chặn trên giao dịch hai và giao dịch Hai bị chặn trên giao dịch một: Điều kiện bế tắc.PostgreSQLsẽ phát hiện điều này tình huống và hủy bỏ một trong các giao dịch.
Bảo vệ tốt nhất chống lại bế tắc nói chung là để tránh chúng bằng cách chắc chắn rằng tất cả các ứng dụng sử dụng cơ sở dữ liệu Có được kèo bóng đá cúp c2 trên nhiều đối tượng theo thứ tự nhất quán. Trong ví dụ trên, nếu cả hai giao dịch đã cập nhật các hàng trong Cùng một trật tự, không có bế tắc sẽ xảy ra. Một người cũng nên đảm bảo rằng kèo bóng đá cúp c2 đầu tiên có được trên một đối tượng trong một giao dịch là chế độ cao nhất sẽ cần thiết cho điều đó sự vật. Nếu không khả thi để xác minh điều này trước, thì Bẫy có thể được xử lý trên đường bay bằng cách thử lại các giao dịch bị hủy bỏ do bế tắc.
Miễn là không phát hiện tình huống bế tắc, một giao dịch Tìm kiếm kèo bóng đá cúp c2 cấp độ bảng hoặc cấp độ hàng sẽ đợi vô thời hạn cho các kèo bóng đá cúp c2 mâu thuẫn sẽ được phát hành. Điều này có nghĩa là Đó là một ý tưởng tồi cho các ứng dụng để các giao dịch mở cho Thời gian dài (ví dụ: trong khi chờ đợi đầu vào của người dùng).
PostgreSQLcung cấp một phương tiện để tạo các kèo bóng đá cúp c2 có ý nghĩa được xác định ứng dụng. Chúng được gọi làkèo bóng đá cúp c2 tư vấn,, bởi vì hệ thống không thực thi việc sử dụng của họ - tùy thuộc vào ứng dụng để sử dụng chúng một cách chính xác. kèo bóng đá cúp c2 tư vấn có thể hữu ích Đối với các chiến lược kèo bóng đá cúp c2 rất phù hợp với MVCC người mẫu. Sau khi có được, một kèo bóng đá cúp c2 tư vấn được giữ cho đến khi rõ ràng phát hành hoặc phiên kết thúc. Không giống như kèo bóng đá cúp c2 tiêu chuẩn, tư vấn kèo bóng đá cúp c2 không tôn trọng ngữ nghĩa giao dịch: một kèo bóng đá cúp c2 có được trong một giao dịch sau đó được quay lại vẫn sẽ được tổ chức theo sau rollback, và tương tự như vậy, một mở kèo bóng đá cúp c2 là có hiệu lực ngay cả khi giao dịch gọi điện thất bại sau đó. Giống nhau kèo bóng đá cúp c2 có thể được mua lại nhiều lần bằng quy trình sở hữu của nó: cho Mỗi yêu cầu kèo bóng đá cúp c2 phải có một yêu cầu mở kèo bóng đá cúp c2 tương ứng Trước khi kèo bóng đá cúp c2 thực sự được phát hành. (Nếu một phiên đã Giữ một kèo bóng đá cúp c2 nhất định, các yêu cầu bổ sung sẽ luôn thành công, Ngay cả khi các phiên khác đang chờ kèo bóng đá cúp c2.) Giống như tất cả các kèo bóng đá cúp c2 TRONGPostgreSQL, một danh sách đầy đủ các kèo bóng đá cúp c2 tư vấn hiện đang được tổ chức bởi bất kỳ phiên nào có thể được tìm thấy trong Thepg_locksChế độ xem hệ thống.
kèo bóng đá cúp c2 tư vấn được phân bổ ra khỏi nhóm bộ nhớ chung có kích thước được xác định bởi các biến cấu hìnhMAX_LOCKS_PER_TRANSACTIONvàMax_Connections. Phải cẩn thận để không làm cạn kiệt bộ nhớ này hoặc máy chủ sẽ không thể cấp bất kỳ kèo bóng đá cúp c2 nào cả. Điều này áp đặt một giới hạn trên đối với số lượng kèo bóng đá cúp c2 tư vấn được cấp bởi máy chủ, thường là hàng chục đến hàng trăm ngàn Tùy thuộc vào cách cấu hình máy chủ.
Cách sử dụng kèo bóng đá cúp c2 tư vấn phổ biến là mô phỏng bi quan các chiến lược kèo bóng đá cúp c2 đặc trưng của cái gọi là"Tệp phẳng"Hệ thống quản lý dữ liệu. Trong khi a cờ được lưu trữ trong bảng có thể được sử dụng cho cùng một mục đích, kèo bóng đá cúp c2 tư vấn nhanh hơn, tránh mvcc bloat và là tự động làm sạch bởi máy chủ ở cuối phiên họp. Trong một số trường hợp nhất định sử dụng phương pháp này, đặc biệt là trong Các truy vấn liên quan đến đặt hàng rõ ràng vàgiới hạnĐiều khoản, phải cẩn thận để kiểm soát kèo bóng đá cúp c2 có được vì thứ tự biểu thức SQL được đánh giá. Ví dụ:
Chọn pg_advisory_lock (id) từ foo trong đó id = 12345; -- Được rồi Chọn pg_advisory_lock (id) từ foo trong đó id 12345 giới hạn 100; -- sự nguy hiểm! Chọn PG_Advisory_Lock (q.id) từ . Chọn ID từ FOO trong đó ID 12345 giới hạn 100; ) Q; -- Được rồi
Trong các truy vấn trên, hình thức thứ hai là nguy hiểm vì TheGiới hạnkhông được đảm bảo là áp dụng trước khi chức năng kèo bóng đá cúp c2 được thực thi. Điều này có thể khiến một số ổ kèo bóng đá cúp c2 phải có được mà ứng dụng không mong đợi, và do đó sẽ không phát hành (cho đến khi nó kết thúc phiên họp). Từ quan điểm của ứng dụng, các kèo bóng đá cúp c2 như vậy sẽ được treo lủng lẳng, mặc dù vẫn có thể xem được trongpg_locks.
Các chức năng được cung cấp để thao túng kèo bóng đá cúp c2 tư vấn là được mô tả trongBảng 9-56.