PostgreSQLCung cấp các chế độ soi kèo bóng đá truoctran 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 để soi kèo bóng đá truoctran 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 soi kèo bóng đá truoctran 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ắn
Khô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 Exclusive
soi kèo bóng đá truoctran trên bảng để thực thi điều đó.)
Để kiểm tra danh sách các soi kèo bóng đá truoctran hiện đang nổi bật trong máy chủ cơ sở dữ liệu, hãy sử dụngpg_locks
Chế độ 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ý soi kèo bóng đá truoctran, hãy tham khảoChương 27.
Danh sách bên dưới hiển thị các chế độ soi kèo bóng đá truoctran có sẵn và các 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ỳ soi kèo bóng đá truoctran nào trong số này một cách rõ ràng với lệnhsoi kèo bóng đá truoctran. Hãy nhớ rằng tất cả các chế độ soi kèo bóng đá truoctran này là soi kèo bóng đá truoctran cấp bảng, ngay cả khi tên chứa từhàngHồi; Tên của các chế độ soi kèo bóng đá truoctran là lịch sử.Bảng 13.2). Hai giao dịch không thể giữ các soi kèo bóng đá truoctran của các chế độ mâu thuẫn trên cùng một bảng cùng một lúc.Access Exclusive
soi kèo bóng đá truoctran và sau đó có đượcChia sẻ truy cập
soi kèo bóng đá truoctran trên cùng một bảng.) Các chế độ soi kèo bóng đá truoctran 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ế độ soi kèo bóng đá truoctran đang tự kết hợp (ví dụ:Access Exclusive
soi kèo bóng đá truoctran không thể được giữ 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ập
soi kèo bóng đá truoctran có thể được tổ chức bởi nhiều giao dịch).
chế độ soi kèo bóng đá truoctran cấp bảng
Chia sẻ truy cập
(AccessSharelock
)Xung đột vớiAccess Exclusive
Chỉ chế độ soi kèo bóng đá truoctran.
TheChọn
Lệnh có được soi kèo bóng đá truoctran 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ế độ soi kèo bóng đá truoctran này.
Chia sẻ hàng
(Rowsharelock
)Xung đột vớiĐộc quyền
vàQuyền truy cập độc quyền
chế độ soi kèo bóng đá truoctran.
TheChọn
Lệnh có được soi kèo bóng đá truoctran chế độ này trên tất cả các bảng mà một trong nhữngđể cập nhật
, Không có cập nhật soi kèo bóng đá truoctran
, để chia sẻ
hoặcđể chia sẻ chính
Tùy chọn được chỉ định (ngoàiChia sẻ truy cập
soi kèo bóng đá truoctran trên bất kỳ bảng nào khác được tham chiếu mà không có bất kỳ rõ ràngcho ...
Tùy chọn soi kèo bóng đá truoctran).
Độc quyền
(RowExclusiveLock
)Xung đột vớichia sẻ
, Chia sẻ độc quyền
, Độc quyền
vàAccess Exclusive
chế độ soi kèo bóng đá truoctran.
Các lệnhCập nhật
, Xóa
, Chèn
vàHợp nhất
Lấy chế độ soi kèo bóng đá truoctran này trên bảng đích (ngoàiChia sẻ truy cập
soi kèo bóng đá truoctran trên bất kỳ bảng được tham chiếu nào khác). Nói chung, chế độ soi kèo bóng đá truoctran 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ền
vàAccess Exclusive
chế độ soi kèo bóng đá truoctran. Chế độ này bảo vệ bảng chống lại các thay đổi lược đồ đồng thời vàNút hút
Chạy.
Được mua bởiVACUUM
(khôngFull
),Phân tích
, Tạo chỉ mục đồng thời
, Tạo thống kê
, Nhận xét về
, Reindex đồng thời
và nhất địnhINDEX ALTER
vàBẢNG ALTER
Biến thể (để biết chi tiết đầy đủ, hãy xem tài liệu của các lệnh này).
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ền
vàAccess Exclusive
chế độ soi kèo bóng đá truoctran. 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ền
vàquyền truy cập độc quyền
chế độ soi kèo bóng đá truoctran. 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 Trigger
và một số hình thức củaBảng thay đổi
.
Độ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ền
vàquyền truy cập độc quyền
chế độ soi kèo bóng đá truoctran. Chế độ này chỉ cho phép đồng thờiChia sẻ truy cập
soi kèo bóng đá truoctran, tức là chỉ đọc từ bảng có thể tiến hành song song với giao dịch giữ chế độ soi kèo bóng đá truoctran 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
(AccessExclusiveLock
)Xung đột với soi kèo bóng đá truoctran 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ề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 DROP
, cắt ngắn
, Reindex
, cụm
, Nút không đầy đủ
vàLàm mới chế độ xem vật chất
(khôngđồng thời
) Các lệnh. Nhiều hình thức củaINDEX ALTER
vàBẢNG ALTER
cũng có được soi kèo bóng đá truoctran ở cấp độ này. Đây cũng là chế độ soi kèo bóng đá truoctran mặc định choBảng soi kèo bóng đá truoctran
Các câu lệnh không chỉ định một chế độ một cách rõ ràng.
chỉ mộtAccess Exclusive
soi kèo bóng đá truoctran chặn AChọn
(khôngđể cập nhật/chia sẻ
) câu lệnh.
Sau khi có được, soi kèo bóng đá truoctran thường được giữ cho đến khi kết thúc giao dịch. Nhưng nếu soi kèo bóng đá truoctran được thu được sau khi thiết lập điểm lưu, soi kèo bóng đá truoctran sẽ được phát hành ngay lập tức nếu điểm lưu được cuộn trở lại.rollback
Hủ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 soi kèo bóng đá truoctran có được trong mộtPL/PGSQLKhối ngoại lệ: Lỗi thoát khỏi khối phát hành soi kèo bóng đá truoctran có được trong đó.
Bảng 13.2. Các chế độ soi kèo bóng đá truoctran mâu thuẫn
Chế độ soi kèo bóng đá truoctran được yêu cầu | Chế độ soi kèo bóng đá truoctran hiện có | |||||||
---|---|---|---|---|---|---|---|---|
Chia sẻ truy cập |
Chia sẻ hàng |
hàng excl. |
Cập nhật chia sẻ excl. |
chia sẻ |
Chia sẻ hàng excl. |
excl. |
Access Excl. |
|
Chia sẻ truy cập |
x | |||||||
Chia sẻ hàng |
x | x | ||||||
hàng excl. |
x | x | x | x | ||||
Cập nhật chia sẻ excl. |
x | x | x | x | x | |||
chia sẻ |
x | x | x | x | x | |||
Chia sẻ hàng excl. |
x | x | x | x | x | x | ||
excl. |
x | x | x | x | x | x | x | |
Access Excl. |
x | x | x | x | x | x | x | x |
Ngoài các soi kèo bóng đá truoctran cấp bảng, còn có các soi kèo bóng đá truoctran 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 soi kèo bóng đá truoctran cấp hàng. Lưu ý rằng một giao dịch có thể giữ các soi kèo bóng đá truoctran 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ủ soi kèo bóng đá truoctranđến cùng một hàng. soi kèo bóng đá truoctran 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ư soi kèo bóng đá truoctran cấp bảng.
chế độ soi kèo bóng đá truoctran cấp độ
để cập nhật
để cập nhật
gây ra các hàng được truy xuất bởiChọn
Tuyên bố sẽ bị soi kèo bóng đá truoctran như thể để cập nhật. Điều này ngăn họ bị soi kèo bóng đá truoctran, 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 soi kèo bóng đá truoctran
, Chọn để chia sẻ
hoặcChọn để chia sẻ soi kèo bóng đá truoctran
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ật
Sẽ 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ẽ soi kèo bóng đá truoctran 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ại
hoặcserializable
Giao dịch, tuy nhiên, một lỗi sẽ được ném nếu một hàng bị soi kèo bóng đá truoctran đã 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ật
Chế độ soi kèo bóng đá truoctran cũng được mua bởi bất kỳ nàoXóa
trê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ật
Trường hợp là những trường hợp có chỉ số duy nhất trên chúng có thể được sử dụng trong soi kèo bóng đá truoctran nước ngoài (vì vậy các chỉ mục một phần và chỉ số biểu thức không được xem xét), nhưng điều này có thể thay đổi trong tương lai.
Không có cập nhật soi kèo bóng đá truoctran
Hành xử tương tự nhưđể cập nhật
, ngoại trừ soi kèo bóng đá truoctran thu được yếu hơn: soi kèo bóng đá truoctran này sẽ không chặnChọn để chia sẻ soi kèo bóng đá truoctran
Các lệnh cố gắng có được một soi kèo bóng đá truoctran trên cùng một hàng. Chế độ soi kèo bóng đá truoctran 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ật
soi kèo bóng đá truoctran.
để chia sẻ
Hành xử tương tự nhưKhông có cập nhật soi kèo bóng đá truoctran
, ngoại trừ việc nó có được soi kèo bóng đá truoctran được chia sẻ thay vì soi kèo bóng đá truoctran độc quyền trên mỗi hàng được truy xuất. Một soi kèo bóng đá truoctran đượ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ật
hoặcChọn không cập nhật soi kèo bóng đá truoctran
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ẻ soi kèo bóng đá truoctran
.
để chia sẻ chính
Hành xử tương tự nhưđể chia sẻ
, ngoại trừ soi kèo bóng đá truoctran yếu hơn:Chọn để cập nhật
bị chặn, nhưng khôngChọn không cập nhật soi kèo bóng đá truoctran
. soi kèo bóng đá truoctran được chia sẻ soi kèo bóng đá truoctran chặn các giao dịch khác thực hiệnXóa
hoặc bất kỳCập nhật
Điều đó thay đổi các giá trị soi kèo bóng đá truoctran, 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 soi kèo bóng đá truoctran
, Chọn để chia sẻ
hoặcChọn chia sẻ soi kèo bóng đá truoctran
.
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ị soi kèo bóng đá truoctran cùng một lúc. Tuy nhiên, soi kèo bóng đá truoctran một hàng có thể gây ra một đĩa ghi, ví dụ:Chọn để cập nhật
Sửa đổi các hàng đã chọn để đánh dấu chúng bị soi kèo bóng đá truoctran và do đó sẽ dẫn đến ghi đĩa.
Bảng 13.3. soi kèo bóng đá truoctran cấp độ mâu thuẫn
Chế độ soi kèo bóng đá truoctran được yêu cầu | Chế độ soi kèo bóng đá truoctran hiện tại | |||
---|---|---|---|---|
để chia sẻ chính | để chia sẻ | Không có cập nhật soi kèo bóng đá truoctran | để cập nhật | |
để chia sẻ chính | x | |||
để chia sẻ | x | x | ||
Không có cập nhật soi kèo bóng đá truoctran | x | x | x | |
để cập nhật | x | x | x | x |
Ngoài soi kèo bóng đá truoctran bàn và hàng, chia sẻ cấp độ trang/soi kèo bóng đá truoctran độ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 soi kèo bóng đá truoctran 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.
Việc sử dụng soi kèo bóng đá truoctran 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 soi kèo bóng đá truoctran giữ mà cái kia muốn. Ví dụ: nếu Giao dịch 1 có được soi kèo bóng đá truoctran độc quyền trên Bảng A và sau đó cố gắng có được soi kèo bóng đá truoctran độc quyền trên Bảng B, trong khi Giao dịch 2 đã bị soi kèo bóng đá truoctran độc quyền B và bây giờ muốn soi kèo bóng đá truoctran độ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 soi kèo bóng đá truoctran cấp hàng (và do đó, chúng có thể xảy ra ngay cả khi soi kèo bóng đá truoctran 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 soi kèo bóng đá truoctran 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ư = cân bằng + 100.00 trong đó acctnum = 22222;
Đầu tiênCập nhật
Câu lệnh có được thành công soi kèo bóng đá truoctran 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ật
Tuyên bố thấy rằng hàng mà nó đang cố gắng cập nhật đã bị soi kèo bóng đá truoctran, vì vậy nó chờ giao dịch có được soi kèo bóng đá truoctran 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 soi kèo bóng đá truoctran cấp hàng trên hàng được chỉ định, nhưng nó không thể: Giao dịch hai đã giữ soi kèo bóng đá truoctran 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 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 đều có soi kèo bóng đá truoctran 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 soi kèo bóng đá truoctran cấp bảng hoặc cấp độ hàng sẽ đợi vô thời hạn để các soi kèo bóng đá truoctran mâu thuẫn đượ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).
POSTGRESQLcung cấp một phương tiện để tạo các soi kèo bóng đá truoctran có ý nghĩa được xác định ứng dụng. Chúng được gọi làsoi kèo bóng đá truoctran 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. soi kèo bóng đá truoctran tư vấn có thể hữu ích cho các chiến lược soi kèo bóng đá truoctran phù hợp với mô hình MVCC."Tệp phẳng”Hệ 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 soi kèo bóng đá truoctran 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 soi kèo bóng đá truoctran tư vấn trongPOSTGRESQL: ở cấp độ phiên hoặc ở cấp độ giao dịch. Sau khi có được ở cấp độ phiên, soi kèo bóng đá truoctran 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 soi kèo bóng đá truoctran trongPostgreSQL, một danh sách đầy đủ các soi kèo bóng đá truoctran 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_locks
Chế độ xem hệ thống.
Cả soi kèo bóng đá truoctran tư vấn và soi kèo bóng đá truoctran 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_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ỳ soi kèo bóng đá truoctran nào.
Trong một số trường hợp nhất định sử dụng các phương thức soi kèo bóng đá truoctran 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
Các điều khoản, phải cẩn thận để kiểm soát các soi kèo bóng đá truoctran 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ạn
không được đảm bảo được áp dụng trước khi chức năng soi kèo bóng đá truoctran được thực thi. Điều này có thể khiến một số soi kèo bóng đá truoctran đượ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 soi kèo bóng đá truoctran tư vấn được mô tả trongPhần 9.28.10.