Phiên bản được hỗ trợ:hiện tại(17)16 / 15 / 14 / 13
Phiên bản phát triển: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 / 8.0 / 7.4 / 7.3
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ế.

13.3. tỷ lệ kèo bóng đá rõ ràng

PostgreSQLCung cấp các chế độ tỷ lệ kèo bóng đá khác nhau để kiểm soát truy cập đồng thời vào dữ liệu trong các bảng. Các chế độ này có thể được sử dụng để tỷ lệ kèo bóng đá do ứng dụng kiểm soát trong các tình huống trong đóMVCCkhông đưa ra hành vi mong muốn. Ngoài ra, hầu hếtPostgreSQLCác lệnh tự động có được các tỷ lệ kèo bóng đá của các chế độ thích hợp để đảm bảo rằng các bảng được tham chiếu không bị hủy 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ụ,cắt ngắnKhô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, do đó nó có đượcAccess Exclusivetỷ lệ kèo bóng đá trên bảng để thực thi điều đó.)

Để kiểm tra danh sách các tỷ lệ kèo bóng đá hiện đang nổi bật trong máy chủ cơ sở dữ liệu, hãy sử dụngpg_locksChế độ xem hệ thống. Để biết thêm thông tin về việc giám sát trạng thái của hệ thống con Trình quản lý tỷ lệ kèo bóng đá, hãy tham khảoChương 28.

13.3.1. tỷ lệ kèo bóng đá cấp bảng

Danh sách bên dưới hiển thị các chế độ tỷ lệ kèo bóng đá có sẵn và bối cảnh chúng được sử dụng tự động bởiPostgreSQL. Bạn cũng có thể có được bất kỳ tỷ lệ kèo bóng đá nào trong số này một cách rõ ràng với lệnhtỷ lệ kèo bóng đá. Hãy nhớ rằng tất cả các chế độ tỷ lệ kèo bóng đá này là tỷ lệ kèo bóng đá cấp bảng, ngay cả khi tên chứa từhàngHồi; Tên của các chế độ tỷ lệ kèo bóng đá là lịch sử.Bảng 13.2). Hai giao dịch không thể giữ các tỷ lệ kèo bóng đá của các chế độ mâu thuẫn trên cùng một bảng cùng một lúc.Access Exclusivetỷ lệ kèo bóng đá và sau đó có đượcChia sẻ truy cậptỷ lệ kèo bóng đá trên cùng một bảng.) Các chế độ tỷ lệ kèo bóng đá không xung đột có thể được tổ chức đồng thời bởi nhiều giao dịch. Thông báo cụ thể rằng một số chế độ tỷ lệ kèo bóng đá đang tự kết hợp (ví dụ:Access Exclusivetỷ lệ kèo bóng đá không thể được tổ chức bởi nhiều giao dịch cùng một lúc) trong khi những người khác không tự doChia sẻ truy cậptỷ lệ kèo bóng đá có thể được tổ chức bởi nhiều giao dịch).

chế độ tỷ lệ kèo bóng đá cấp bảng

Chia sẻ truy cập(AccessSharelock)

Xung đột vớiAccess ExclusiveChỉ chế độ tỷ lệ kèo bóng đá.

TheChọnLệnh có được tỷ lệ kèo bóng đá chế độ này trên các bảng được tham chiếu. Nói chung, bất kỳ truy vấn nào chỉđọcMột bảng và không sửa đổi nó sẽ có được chế độ tỷ lệ kèo bóng đá này.

Chia sẻ hàng(Rowsharelock)

Xung đột vớiĐộc quyềnquyền truy cập độc quyềnchế độ tỷ lệ kèo bóng đá.

TheChọn để cập nhậtChọn chia sẻCác lệnh có được tỷ lệ kèo bóng đá chế độ này trên (các) bảng đích (ngoàiChia sẻ truy cậptỷ lệ kèo bóng đá 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ẻ).

Độc quyền(RowExclusiveLock)

Xung đột vớichia sẻ, Chia sẻ độc quyền, Độc quyềnAccess Exclusivechế độ tỷ lệ kèo bóng đá.

Các tỷ lệ kèo bóng đánhCập nhật, XóaChènLấy chế độ tỷ lệ kèo bóng đá này trên bảng đích (ngoàiChia sẻ truy cậptỷ lệ kèo bóng đá trên bất kỳ bảng được tham chiếu nào khác). Nói chung, chế độ tỷ lệ kèo bóng đá này sẽ được mua lại bởi bất kỳ lệnh nàosửa đổi dữ liệutrong bảng.

Cập nhật chia sẻ độc quyền(ShareUpDateExclusiveLock)

Xung đột vớiCập nhật chia sẻ độc quyền, chia sẻ, Chia sẻ độc quyền, Độc quyềnAccess Exclusivechế độ tỷ lệ kèo bóng đá. Chế độ này bảo vệ bảng chống lại các thay đổi lược đồ đồng thời vàVACUUMChạy.

Được mua bởiVACUUM(không cóFull),Phân tích, Tạo chỉ mục đồng thời, Tạo thống kê, Nhận xét vềALTER BẢNG xác thựcvà khácBảng thay đổiBiến thể (để biết chi tiết đầy đủ, xemPostgreSQL: Tài).

chia sẻ(Sharelock)

Xung đột vớiROW ĐỘC QUYỀN, Cập nhật chia sẻ độc quyền, Chia sẻ độc quyền, Độc quyềnAccess Exclusivechế độ tỷ lệ kèo bóng đá. Chế độ này bảo vệ bảng chống lại các thay đổi dữ liệu đồng thời.

Được mua bởiTạo chỉ mục(khôngđồng thời).

Chia sẻ độc quyền(SharerowExclusiveLock)

Xung đột vớiROW ĐỘC QUYỀN, Cập nhật chia sẻ độc quyền, chia sẻ, Chia sẻ độc quyền, Độc quyềnAccess Exclusivechế độ tỷ lệ kèo bóng đá. Chế độ này bảo vệ bảng chống lại các thay đổi dữ liệu đồng thời và tự độc quyền để chỉ có một phiên có thể giữ nó tại một thời điểm.

Được mua bởiTạo đối chiếu, Tạo Triggervà nhiều hình thức củaBảng thay đổi(xemPostgreSQL:).

Độc quyền(ExclusiveLock)

Xung đột vớiChia 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ềnAccess Exclusivechế độ tỷ lệ kèo bóng đá. Chế độ này chỉ cho phép đồng thờiChia sẻ truy cậptỷ lệ kèo bóng đá, tức là chỉ đọc từ bảng có thể tiến hành song song với giao dịch giữ chế độ tỷ lệ kèo bóng đá này.

Được mua bởiLàm mới chế độ xem vật chất đồng thời.

quyền truy cập độc quyền(AccessExclusiveRock)

Xung đột với tỷ lệ kèo bóng đá của tất cả các chế độ (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ềnAccess 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 DROP, cắt ngắn, Reindex, cụm, Nút không đầy đủLàm mới chế độ xem vật chất(khôngđồng thời) Các tỷ lệ kèo bóng đánh. Nhiều hình thức củaBảng thay đổicũng có được tỷ lệ kèo bóng đá ở cấp độ này. Đây cũng là chế độ tỷ lệ kèo bóng đá mặc định choBảng tỷ lệ kèo bóng đáCác câu tỷ lệ kèo bóng đánh không chỉ định một chế độ một cách rõ ràng.

TIP

chỉ mộtAccess Exclusivetỷ lệ kèo bóng đá chặn AChọn(khôngđể cập nhật/chia sẻ) câu tỷ lệ kèo bóng đánh.

Sau khi có được, tỷ lệ kèo bóng đá thường được giữ cho đến khi kết thúc giao dịch. Nhưng nếu tỷ lệ kèo bóng đá được thu được sau khi thiết lập điểm lưu, tỷ lệ kèo bóng đá sẽ được phát hành ngay lập tức nếu điểm lưu được cuộn trở lại.rollbackHủy tất cả các hiệu ứng của các lệnh kể từ điểm lưu. Tương tự giữ cho các tỷ lệ kèo bóng đá có được trong mộtPL/PGSQLKhối ngoại lệ: Lỗi thoát khỏi khối phát hành tỷ lệ kèo bóng đá có được trong đó.

Bảng 13.2.  Các chế độ tỷ lệ kèo bóng đá mâu thuẫn

Chế độ tỷ lệ kèo bóng đá được yêu cầu Chế độ tỷ lệ kèo bóng đá 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

13.3.2. tỷ lệ kèo bóng đá cấp độ

Ngoài các tỷ lệ kèo bóng đá cấp bảng, còn có các tỷ lệ kèo bóng đá cấp hàng, được liệt kê như dưới đây với các bối cảnh mà chúng được sử dụng tự động bởiPostgreSQL. Nhìn thấyBảng 13.3Đối với một bảng hoàn chỉnh các xung đột tỷ lệ kèo bóng đá cấp độ hàng. Lưu ý rằng một giao dịch có thể giữ các tỷ lệ kèo bóng đá mâu thuẫn trên cùng một hàng, ngay cả trong các phép trừ khác nhau;nhà văn và tủ tỷ lệ kèo bóng đáđến cùng một hàng. tỷ lệ kèo bóng đá cấp độ hàng được phát hành ở cuối giao dịch hoặc trong quá trình rollback savePoint, giống như tỷ lệ kèo bóng đá cấp bảng.

chế độ tỷ lệ kèo bóng đá cấp độ

để cập nhật

để cập nhậtgây ra các hàng được truy xuất bởiChọnTuyên bố sẽ bị tỷ lệ kèo bóng đá như thể để cập nhật. Điều này ngăn họ bị tỷ lệ kèo bóng đá, sửa đổi hoặc bị xóa bởi các giao dịch khác cho đến khi giao dịch hiện tại kết thúc.Cập nhật, Xóa, Chọn để cập nhật, Chọn không cập nhật tỷ lệ kèo bóng đá, Chọn chia sẻhoặcChọn chia sẻ tỷ lệ kèo bóng đáTrong số các hàng này sẽ bị chặn cho đến khi giao dịch hiện tại kết thúc; Ngược lại,Chọn để cập nhậtSẽ chờ một giao dịch đồng thời đã chạy bất kỳ lệnh nào trong cùng một hàng, và sau đó sẽ tỷ lệ kèo bóng đá và trả lại hàng cập nhật (hoặc không có hàng, nếu hàng bị xóa). Trong aĐọc lặp lạihoặcserializableGiao dịch, tuy nhiên, một lỗi sẽ được ném nếu một hàng bị tỷ lệ kèo bóng đá đã thay đổi kể từ khi giao dịch bắt đầu. Để thảo luận thêm, xemPhần 13.4.

Theđể cập nhậtChế độ tỷ lệ kèo bóng đá cũng được mua lại bởi bất kỳ nàoXóatrên một hàng, và cả bởi mộtCập nhậtĐiều chỉnh các giá trị của các cột nhất định. Hiện tại, tập hợp các cột được xem xét choCập nhật29020_29205

Không có cập nhật tỷ lệ kèo bóng đá

Hành xử tương tự nhưđể cập nhật, ngoại trừ tỷ lệ kèo bóng đá thu được yếu hơn: tỷ lệ kèo bóng đá này sẽ không chặnChọn chia sẻ tỷ lệ kèo bóng đáCác lệnh cố gắng có được một tỷ lệ kèo bóng đá trên cùng một hàng. Chế độ tỷ lệ kèo bóng đá này cũng được mua lại bởi bất kỳCập nhậtĐiều đó không có đượcđể cập nhậttỷ lệ kèo bóng đá.

để chia sẻ

Hành xử tương tự nhưKhông có cập nhật tỷ lệ kèo bóng đá, ngoại trừ việc nó có được một tỷ lệ kèo bóng đá được chia sẻ thay vì tỷ lệ kèo bóng đá độc quyền trên mỗi hàng được truy xuất. Một tỷ lệ kèo bóng đá được chia sẻ chặn các giao dịch khác thực hiệnCập nhật, Xóa, Chọn để cập nhậthoặcChọn không cập nhật tỷ lệ kèo bóng đáTrên các hàng này, nhưng nó không ngăn chúng thực hiệnChọn để chia sẻhoặcChọn chia sẻ tỷ lệ kèo bóng đá.

để chia sẻ chính

Hành xử tương tự nhưđể chia sẻ, ngoại trừ tỷ lệ kèo bóng đá yếu hơn:Chọn để cập nhậtbị chặn, nhưng khôngChọn không cập nhật tỷ lệ kèo bóng đá. tỷ lệ kèo bóng đá được chia sẻ tỷ lệ kèo bóng đá chặn các giao dịch khác thực hiệnXóahoặc bất kỳCập nhậtĐiều đó thay đổi các giá trị tỷ lệ kèo bóng đá, nhưng không phải khácCập nhật, Và nó cũng không ngăn đượcChọn không cập nhật tỷ lệ kèo bóng đá, Chọn để chia sẻhoặcChọn để chia sẻ tỷ lệ kèo bóng đá.

PostgreSQLKhông nhớ bất kỳ thông tin nào về các hàng được sửa đổi trong bộ nhớ, do đó không có giới hạn về số lượng hàng bị tỷ lệ kèo bóng đá cùng một lúc. Tuy nhiên, tỷ lệ kèo bóng đá một hàng có thể gây ra một đĩa ghi, ví dụ:Chọn để cập nhậtSửa đổi các hàng đã chọn để đánh dấu chúng bị tỷ lệ kèo bóng đá và do đó sẽ dẫn đến ghi đĩa.

Bảng 13.3. tỷ lệ kèo bóng đá cấp độ mâu thuẫn

Chế độ tỷ lệ kèo bóng đá được yêu cầu Chế độ tỷ lệ kèo bóng đá hiện tại
để chia sẻ chính để chia sẻ Không có cập nhật tỷ lệ kèo bóng đá để cập nhật
Để chia sẻ chính x
để chia sẻ x x
Không có cập nhật tỷ lệ kèo bóng đá x X x
để cập nhật x x x x

13.3.3. tỷ lệ kèo bóng đá cấp trang

Ngoài tỷ lệ kèo bóng đá bảng và hàng, chia sẻ cấp độ trang/tỷ lệ kèo bóng đá độc quyền được sử dụng để kiểm soát quyền truy cập đọc/ghi vào các trang bảng trong nhóm bộ đệm được chia sẻ. Các tỷ lệ kèo bóng đá 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.

13.3.4. Bế tắc

Việc sử dụng tỷ lệ kèo bóng đá rõ ràng có thể tăng khả năng củabế tắc, trong đó hai (hoặc nhiều) giao dịch mỗi tỷ lệ kèo bóng đá giữ mà cái kia muốn. Ví dụ: nếu Giao dịch 1 có được tỷ lệ kèo bóng đá độc quyền trên Bảng A và sau đó cố gắng có được tỷ lệ kèo bóng đá độc quyền trên Bảng B, trong khi Giao dịch 2 đã bị tỷ lệ kèo bóng đá độc quyền B và bây giờ muốn tỷ lệ kèo bóng đá độc quyền trên Bảng A, thì không ai có thể tiến hành.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 (các) (các) khác hoàn thành. (Chính xác là giao dịch nào sẽ bị hủy bỏ rất khó dự đoán và không nên dựa vào.)

Lưu ý rằng bế tắc cũng có thể xảy ra do kết quả của tỷ lệ kèo bóng đá cấp hàng (và do đó, chúng có thể xảy ra ngay cả khi tỷ lệ kèo bóng đá rõ ràng không được sử dụng). Xem xét trường hợp trong đó hai giao dịch đồng thời sửa đổi một bảng.

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 tỷ lệ kèo bóng đá cấp hàng trên hàng với số tài khoản được chỉ định. Sau đó, giao dịch thứ hai thực thi:

Cập nhật tài khoản đặt số dư = số dư + 100.00 trong đó acctnum = 22222;

Đầu tiênCập nhậtCâu lệnh có được thành công tỷ lệ kèo bóng đá cấp hàng trên hàng được chỉ định, do đó, nó thành công trong việc cập nhật hàng đó. Tuy nhiên, thứ haiCập nhậtCâu lệnh thấy rằng hàng mà nó đang cố gắng cập nhật đã bị tỷ lệ kèo bóng đá, vì vậy nó chờ giao dịch thu được tỷ lệ kèo bóng đá 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.

Cập nhật tài khoản đặt số dư = số dư - 100.00 trong đó acctnum = 22222;

Giao dịch Một lần cố gắng có được tỷ lệ kèo bóng đá cấp hàng trên hàng được chỉ định, nhưng không thể: Giao dịch hai đã giữ tỷ lệ kèo bóng đá như vậy. Vì vậy, nó chờ giao dịch hai để hoàn thành.PostgreSQLsẽ phát hiện tình huống này 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 thường 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 tỷ lệ kèo bóng đá 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 theo cùng một thứ tự, sẽ không có bế tắc nào xảy ra.

Miễn là không phát hiện ra tình huống bế tắc nào, một giao dịch tìm kiếm tỷ lệ kèo bóng đá cấp bảng hoặc tỷ lệ kèo bóng đá cấp hàng sẽ chờ vô thời hạn để các tỷ lệ kèo bóng đá xung đột đượ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 để giữ các giao dịch mở trong thời gian dài (ví dụ: trong khi chờ đợi đầu vào của người dùng).

13.3.5. tỷ lệ kèo bóng đá tư vấn

POSTGRESQLCung cấp một phương tiện để tạo các tỷ lệ kèo bóng đá có ý nghĩa được xác định ứng dụng. Chúng được gọi làtỷ lệ kèo bóng đá tư vấn, vì hệ thống không thực thi việc sử dụng chúng - tùy thuộc vào ứng dụng để sử dụng chúng một cách chính xác. tỷ lệ kèo bóng đá tư vấn có thể hữu ích cho các chiến lược tỷ lệ kèo bóng đá phù hợp với mô hình MVCC.MạnhTệp phẳngHàngHệ thống quản lý dữ liệu. Mặc dù một lá cờ được lưu trữ trong bảng có thể được sử dụng cho cùng một mục đích, các tỷ lệ kèo bóng đá tư vấn nhanh hơn, tránh phình ra và được máy chủ tự động dọn dẹp vào cuối phiên.

Có hai cách để có được tỷ lệ kèo bóng đá tư vấn trongPostgreSQL: ở cấp độ phiên hoặc ở cấp độ giao dịch. Sau khi có được ở cấp độ phiên, tỷ lệ kèo bóng đá tư vấn được giữ cho đến khi phát hành rõ ràng hoặc phiên kết thúc.

Giống như tất cả các tỷ lệ kèo bóng đá trongPostgreSQL, một danh sách đầy đủ các tỷ lệ kèo bóng đá tư vấn hiện có thể được tổ chức bởi bất kỳ phiên nào có thể được tìm thấy trongpg_locksChế độ xem hệ thống.

Cả tỷ lệ kèo bóng đá tư vấn và tỷ lệ kèo bóng đá thông thường đều được lưu trữ trong nhóm bộ nhớ dùng chung có kích thước được xác định bởi các biến cấu hìnhMAX_LOCKS_PER_TRANSACTIONMax_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ỳ tỷ lệ kèo bóng đá nào.

Trong một số trường hợp nhất định sử dụng các phương thức tỷ lệ kèo bóng đá tư vấn, đặc biệt là trong các truy vấn liên quan đến đặt hàng rõ ràng vàgiới hạnCác điều khoản, phải cẩn thận để kiểm soát các tỷ lệ kèo bóng đá thu được do thứ tự được đánh giá các biểu thức SQL. Ví dụ:

Chọn pg_advisory_lock (id) từ foo trong đó id = 12345; -- Được rồi

Trong các truy vấn trên, mẫu thứ hai là nguy hiểm vìgiới hạnkhông được đảm bảo sẽ được áp dụng trước khi chức năng tỷ lệ kèo bóng đá được thực thi. Điều này có thể khiến một số tỷ lệ kèo bóng đá được thu thập mà ứng dụng không mong đợi và do đó sẽ không phát hành (cho đến khi kết thúc phiên).pg_locks.

Các chức năng được cung cấp để thao tác tỷ lệ kèo bóng đá tư vấn được mô tả trongPhần 9.26.10.