Postgresql 9.3.25 Tài liệu | ||||
---|---|---|---|---|
배트맨 토토 PostgreSQL : 문서 : 9.3 : 트랜잭션 격리 | 메이저 토토 사이트 : 문서 : 9.3 : 동시성 제어 | Chươ윈 토토 13. Điều khiển đồ윈 토토 thời | NEXT |
PostgreSQLcu윈 토토 cấp nhiều Các chế độ khóa để kiểm soát truy cập đồ윈 토토 thời vào dữ liệu tro윈 토토 các bả윈 토토. Nhữ윈 토토 cái này Các chế độ có thể được sử dụ윈 토토 để khóa do ứ윈 토토 dụ윈 토토 kiểm soát tro윈 토토 các tình huố윈 토토 Ở đâuMVCCkhô윈 토토 cu윈 토토 cấp hành vi mo윈 토토 muốn. 윈 토토oài ra, hầu hếtPostgreSQLlệnh tự độ윈 토토 có được khóa các chế độ thích hợp để đảm bảo rằ윈 토토 các bả윈 토토 được tham chiếu khô윈 토토 bị bỏ hoặc sửa đổi theo nhữ윈 토토 cách khô윈 토토 tươ윈 토토 thích tro윈 토토 khi lệnh thực thi. (Ví dụ,cắt 윈 토토ắnKhô윈 토토 thể được thực hiện đồ윈 토토 thời một cách an toàn với các hoạt độ윈 토토 khác trên cù윈 토토 bả윈 토토, vì vậy nó có được một khóa độc quyền trên bàn để thực thi cái đó.)
Để kiểm tra danh sách các khóa hiện đa윈 토토 nổi bật tro윈 토토 A tro윈 토토 A Máy chủ cơ sở dữ liệu, sử dụ윈 토토pg_locksChế độ xem hệ thố윈 토토. Để biết thêm thông tin về Giám sát trạng thái của hệ thống con Trình quản lý khóa, tham khảo롤 토토 : 문서 :.
Danh sách bên dưới hiển thị các chế độ khóa có sẵn và bối cảnh tro윈 토토 đó chú윈 토토 được sử dụ윈 토토 tự độ윈 토토 bởiPostgreSQL. Bạn cũ윈 토토 có thể có được bất kỳ tro윈 토토 số này Khóa một cách rõ rà윈 토토 với lệnhPostgreSQL : 문서 : 9.3 : 롤 토토. Hãy nhớ rằng tất cả các chế độ khóa này là khóa cấp bảng, thậm chí Nếu tên chứa từ"hà윈 토토"; các Tên của các chế độ khóa là lịch sử. Ở một mức độ nào đó, tên phản ánh việc sử dụng điển hình của từng chế độ khóa - nhưng ngữ nghĩa là Tất cả đều giống nhau. Sự khác biệt thực sự duy nhất giữa một chế độ khóa và Một cái khác là tập hợp các chế độ khóa mà mỗi xung đột (xemBả윈 토토 13-2). Hai giao dịch không thể giữ khóa các chế độ xung đột Trên cùng một bảng cùng một lúc. (Tuy nhiên, một giao dịch không bao giờ xung đột với chính nó. Ví dụ: nó có thể có đượcAccess Exclusivekhóa và sau đó có đượcChia sẻ truy cậpKhóa trên cùng một bảng.) Các chế độ khóa không xung đột có thể được tổ chức đồ윈 토토 thời bởi nhiều giao dịch. Đặc biệt chú ý rằng một số chế độ khóa là Tự do (ví dụ:Truy cập LOẠI TRỪkhóa không thể được giữ bởi nhiều giao dịch tại một thời gian) trong khi những người khác không tự tin (ví dụ:Chia sẻ truy cậpKhóa có thể được giữ bởi nhiều giao dịch).
chế độ khóa cấp bảng
Xu윈 토토 đột vớiAccess ExclusiveChỉ chế độ khóa.
TheChọnLệnh có được một khóa của 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 không sửa đổi nó sẽ có được chế độ khóa này.
Xu윈 토토 đột vớiĐộc quyềnvàAccess Exclusivechế độ khóa.
TheChọn để cập nhậtvàChọn chia sẻlệnh có được khóa này Chế độ trên (các) bảng đích (ngoàiChia sẻ truy cậpKhóa trên bất kỳ bả윈 토토 nào khác được tham chiếu như윈 토토 khô윈 토토 được chọnĐể cập nhật/cho CHIA SẺ).
Xu윈 토토 đột vớichia sẻ, Chia sẻ độc quyền hà윈 토토, Độc quyềnvàTruy cập LOẠI TRỪchế độ khóa.
Các lệnhCập nhật, XóavàChènmua lại Chế độ khóa này trên bảng đích (ngoàiChia sẻ truy cậpKhóa trên bất kỳ bảng được tham chiếu nào khác). Nói chung, chế độ khóa này sẽ được mua lại bởi bất kỳ lệnh nàosửa đổi dữ liệuTro윈 토토 a bàn.
Xu윈 토토 độ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ế độ khóa. Chế độ này bảo vệ một bảng chống lại Thay đổi lược đồ đồ윈 토토 thời vàVACUUMchạy.
Được mua bởiVACUUM(khô윈 토토Full),Phân tích, Tạo chỉ mục đồ윈 토토 thờivà một số hình thức củaBả윈 토토 thay đổi.
Xu윈 토토 đột vớiROW ĐỘC QUYỀN, Cập nhật chia sẻ độc quyền, Chia sẻ độc quyền, Độc quyềnvàTruy cập LOẠI TRỪchế độ khóa. Chế độ này bảo vệ một bảng chống lại Thay đổi dữ liệu đồ윈 토토 thời.
Được mua bởiTạo chỉ mục(khô윈 토토đồ윈 토토 thời).
Xu윈 토토 đột vớiĐộc quyền, Cập nhật chia sẻ độc quyền, chia sẻ, Chia sẻ độc quyền, Độc quyềnvàTruy cập LOẠI TRỪchế độ khóa. Chế độ này bảo vệ một bảng chống lại thay đổi dữ liệu đồ윈 토토 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.
Chế độ khóa này không được tự động mua bởi bất kỳ nàoPostgreSQLlệnh.
Xu윈 토토 đột vớiChia sẻ hà윈 토토, Độc quyền, Chia sẻ Cập nhật độc quyền, chia sẻ, Chia sẻ độc quyền, Độc quyềnvàTruy cập LOẠI TRỪchế độ khóa. Chế độ này chỉ cho phép đồ윈 토토 thờiChia sẻ truy cậpkhóa, tức là chỉ đọc từ Bảng có thể tiến hành song song với một giao dịch giữ cái này Chế độ khóa.
Chế độ khóa này không được tự động có được trên các bảng bởi bất kỳPostgreSQLlệnh.
Xu윈 토토 đột với khóa của tất cả các chế độ (Truy cập CHIA SẺ, Chia sẻ hà윈 토토, ROW ĐỘC QUYỀN, Cậ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ế độ này đảm bảo rằng người giữ là Giao dịch truy cập bảng theo bất kỳ cách nào.
Được mua bởiBả윈 토토 thay đổi, BẢ윈 토토 DROP, cắt 윈 토토ắn, Reindex, cụm, Nút khô윈 토토 đầy đủvàLàm mới chế độ xem vật chất(khô윈 토토đồ윈 토토 thời) Các lệnh. Đây cũng là khóa mặc định Chế độ choBảng khóaChỉ định một chế độ một cách rõ rà윈 토토.
Tip:chỉ mộtAccess ExclusiveKhóa chặn AChọn(khô윈 토토để cập nhật/chia sẻ) câu lệnh.
Sau khi có được, một khóa thường được giữ cho đến khi kết thúc giao dịch. Nhưng nếu khóa được thu được sau khi thiết lập điểm lưu, khóa được phát hành ngay lập tức nếu điểm lưu được cuộn trở lại. Đây là 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. Tương tự giữ cho các khóa có được trong mộtPL/PGSQLKhối ngoại lệ: Lỗi thoát khỏi khối phát hành khóa có được trong đó.
Bảng 13-2. Các chế độ khóa mâu thuẫn
Chế độ khóa được yêu cầu | Chế độ khóa hiện tại | |||||||
---|---|---|---|---|---|---|---|---|
Chia sẻ truy cập | Chia sẻ hà윈 토토 | 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à윈 토토 | 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 khóa cấp bảng, còn có khóa cấp hàng, có thể là khóa độc quyền hoặc chia sẻ. Một khóa cấp độ độc quyền 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. Khóa được giữ cho đến khi giao dịch thực hiện hoặc cuộn Quay lại, giống như khóa cấp bàn. Khóa cấp hàng không ảnh hưởng truy vấn dữ liệu; họ chỉ chặnNhà văn với cù윈 토토 một hà윈 토토.
Để có được khóa cấp độ hàng độc quyền trên một hàng mà không 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 khóa cấp độ hàng được mua, Giao dịch có thể cập nhật hàng nhiều lần mà không sợ xung đột.
Để có được khóa cấp hàng được chia sẻ trên một hàng, chọn hàng vớiChọn chia sẻ. Một khóa chia sẻ không Ngăn chặn các giao dịch khác có được khóa được chia sẻ tương tự. Tuy nhiên, không có giao dịch nào được phép cập nhật, xóa hoặc Khóa độc quyền một hàng trên đó bất kỳ giao dịch nào khác giữ Khóa được chia sẻ. Mọi nỗ lực để làm như vậy sẽ chặn cho đến khi chia sẻ (s) đã được phát hành.
PostgreSQLKhông nhớ bất kỳ thông tin về các hàng đã sửa đổi trong bộ nhớ, do đó không có giới hạn về Số lượng hàng bị khóa cùng một lúc. Tuy nhiên, việc khóa một hàng có thể gây ra một đĩa ghi, ví dụ:Chọn cho CẬP NHẬTsửa đổi các hàng đã chọn để đánh dấu chúng bị khóa, và vì vậy sẽ kết quả trong đĩa ghi.
Ngoài khóa bàn và hàng, chia sẻ cấp độ trang/độc quyền Khóa được sử dụng để kiểm soát quyền truy cập đọc/ghi vào các trang bảng trong Bể đệm chia sẻ. Những ổ khóa này được phát hành ngay sau khi Hàng được tìm nạp hoặc cập nhật. Các nhà phát triển ứng dụng thường không cần quan tâm đến các khóa cấp trang, nhưng chúng được đề cập ở đây cho tính đầy đủ.
Việc sử dụng khóa 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 khóa giữ mà người kia muốn. Ví dụ, nếu Giao dịch 1 có được khóa độc quyền trên Bảng A và sau đó thử Để có được một khóa độc quyền trên Bảng B, trong khi giao dịch 2 có Bảng B được khóa độc quyền và bây giờ muốn có một khóa độc quyền Bảng A, sau đó không ai có thể tiến hành.POSTGRESQLTự động phát hiện bế tắc tình huống 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) người khác hoàn thành. (Chính xác là Giao dịch sẽ bị hủy bỏ rất khó dự đoán và không nên được dựa vào.)
Lưu ý rằng bế tắc cũng có thể xảy ra do kết quả của cấp độ hàng khóa (và do đó, chúng có thể xảy ra ngay cả khi khóa rõ ràng không đã sử dụng). Xem xét trường hợp trong đó hai giao dịch đồ윈 토토 thời Sửa đổi một bảng. Giao dịch đầu tiên thực hiện:
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 khóa 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ậtCâu lệnh thành công có được một khóa cấp hàng trên hàng được chỉ định, vì vậy nó thành công trong Cập nhật hàng đó. Tuy nhiên, thứ haiCập nhậtCâu lệnh thấy rằng hàng nó đang cố gắng Cập nhật đã bị khóa, vì vậy nó chờ giao dịch Điều đó có được khóa để hoàn thành. Giao dịch hai hiện đang chờ đợi trên giao dịch một để hoàn thành trước khi nó tiếp tục thực hiện. Hiện nay, 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 khóa cấp hàng trên Hàng được chỉ định, nhưng nó không thể: Giao dịch hai đã giữ một khóa. 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: một điều kiện bế tắc.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 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 khóa cơ sở dữ liệu có được 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ự, không bế tắc sẽ xảy ra. Người ta cũng nên đảm bảo rằng người đầu tiên Khóa có được trên một đối tượng trong một giao dịch là hạn chế nhất Chế độ sẽ cần thiết cho đối tượng đó. Nếu nó không khả thi xác minh điều này trước, sau đó các bế tắc có thể được xử lý khi đang bay bằng cách thử lại các giao dịch 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 khóa cấp độ bảng hoặc cấp độ hàng sẽ đợi vô thời hạn cho các khóa mâu thuẫn sẽ được phát hành. Điều này có nghĩa là nó là một ý tưởng tồi cho các ứng dụng để giữ các giao dịch mở lâu khoảng thời gian (ví dụ: trong khi chờ đợi đầu vào của người dùng).
PostgreSQLcung cấp một phương tiện cho Tạo các khóa có ý nghĩa được xác định ứng dụng. Đây là gọi điệnKhóa tư vấn, 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. Khóa tư vấn có thể hữu ích cho các chiến lược khóa Đó là một sự phù hợp khó xử cho mô hình MVCC. Ví dụ: một Sử dụng khóa tư vấn là mô phỏng các chiến lược khóa bi quan Điển hình của cái gọi là"Tệp phẳ윈 토토"Dữ liệu Hệ thống quản lý. Trong khi một lá cờ được lưu trữ trong bảng có thể được sử dụng Đối với cùng một mục đích, khóa tư vấn nhanh hơn, tránh phình to, và được máy chủ tự động dọn dẹp vào cuối phiên họp.
Có hai cách để có được khóa tư vấn trongPostgreSQL: ở cấp độ phiên hoặc tại giao dịch mức độ. Sau khi có được ở cấp phiên, khóa tư vấn được giữ cho đến khi phát hành rõ ràng hoặc phiên kết thúc. Không giống như khóa tiêu chuẩn yêu cầu, yêu cầu khóa tư vấn cấp phiên không tôn trọng Nguyên tắc giao dịch: một khóa có được trong một giao dịch sau đó được quay trở lại vẫn sẽ được giữ sau khi quay lại, và Tương tự như vậy, một sự mở khóa có hiệu lực ngay cả khi giao dịch gọi điện thất bại sau. Một khóa có thể được mua lại nhiều lần bằng cách sở hữu của nó quá trình; Đối với mỗi yêu cầu khóa đã hoàn thành, phải có một Yêu cầu mở khóa tương ứng trước khi khóa thực sự được phát hành. Mặt khác, các yêu cầu khóa cấp giao dịch Giống như các yêu cầu khóa thông thường: Chúng được tự động phát hành tại Kết thúc giao dịch, và không có hoạt động mở khóa rõ ràng. Hành vi này thường thuận tiện hơn so với cấp độ phiên Hành vi sử dụng ngắn hạn của khóa tư vấn. Cấp độ phiên và yêu cầu khóa cấp giao dịch cho cùng một khóa tư vấn Định danh sẽ chặn nhau theo cách dự kiến. Nếu một phiên đã giữ một khóa tư vấn nhất định, các yêu cầu bổ sung của nó sẽ Luôn thành công, ngay cả khi các phiên khác đang chờ khóa; cái này tuyên bố là đúng bất kể việc giữ khóa hiện có và Yêu cầu mới ở cấp độ phiên hoặc cấp độ giao dịch.
Giống như tất cả các khóa trongPostgreSQL, a Danh sách đầy đủ các khóa 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 trongpg_locksChế độ xem hệ thố윈 토토.
Cả khóa tư vấn và khóa thông thường đều được lưu trữ trong một chia sẻ Nhóm bộ nhớ 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ỳ ổ khóa nào cả. Điều này áp đặt giới hạn trên đối với số lượng khóa tư vấn có thể được cấp bởi máy chủ, thường là trong hàng chục đến hàng trăm ngàn tùy thuộc vào máy chủ được định cấu hình.
Trong một số trường hợp nhất định sử dụng các phương pháp khóa 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ạnĐiều khoản, phải cẩn thận để kiểm soát khóa có được vì thứ tự biểu thức SQL đá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 WHERE ID 12345 Giới hạn 100 ) Q; -- Được rồi
Tro윈 토토 các truy vấn trên, mẫu thứ hai là 윈 토토uy hiểm vìgiới hạnkhông được đảm bảo sẽ được áp dụng Trước khi chức năng khóa được thực thi. Điều này có thể gây ra một số khóa để 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). Từ Quan điểm của ứng dụng, các khóa như vậy sẽ bị 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ác khóa tư vấn là được mô tả trongPhần 9.26.8.
Prev | 배트맨 토토 : 문서 | Tiếp theo |
Giao dịch Sự cách ly | 메이저 토토 사이트 : 문서 : 9.3 : 동시성 제어 | Kiểm tra tính nhất quán dữ liệu Ở cấp độ ứ윈 토토 dụ윈 토토 |