Không. FOR UPDATE
chỉ khóa những hàng đó , để một giao dịch khác cố gắng khóa chúng (với FOR SHARE
, FOR UPDATE
, UPDATE
hoặc DELETE
) khối cho đến khi giao dịch của bạn cam kết hoặc quay trở lại.
Nếu bạn muốn khóa toàn bộ bảng để chặn chèn / cập nhật / xóa, bạn có thể muốn LOCK TABLE ... IN EXCLUSIVE MODE
.
-
Xem
lock_timeout
thiết lập . Điều này đã được thêm vào 9.3 và không có sẵn trong các phiên bản cũ hơn.Có thể đạt được ước lượng thô cho các phiên bản cũ hơn với
statement_timeout
, nhưng điều đó có thể dẫn đến các báo cáo bị hủy bỏ một cách không cần thiết. Nếustatement_timeout
là 1s và một câu lệnh đợi 950ms khi khóa, sau đó nó có thể nhận được khóa và tiếp tục, chỉ bị hủy ngay lập tức khi hết thời gian. Không phải những gì bạn muốn.Không có cách nào ở cấp độ truy vấn để đặt
lock_timeout
, nhưng bạn có thể và chỉ nên:SET LOCAL lock_timeout = '1s';
sau khi bạn
BEGIN
một giao dịch. -
Có một tuyên bố hết thời gian, nhưng khóa được giữ ở giao dịch mức độ. Không có tính năng hết thời gian chờ giao dịch.
Nếu bạn đang chạy các giao dịch một sao kê, bạn chỉ có thể đặt một
statement_timeout
trước khi chạy câu lệnh để giới hạn thời gian nó có thể chạy. Tuy nhiên, điều này không hoàn toàn giống với việc giới hạn thời gian nó có thể giữ khóa, bởi vì nó có thể đợi 900 mili giây trong 1 giây cho phép để khóa, chỉ thực sự giữ khóa trong 100 mili giây, sau đó bị hủy khi hết thời gian. -
Không. Bạn phải:
BEGIN; SET LOCAL lock_timeout = '4s'; SELECT ....; COMMIT;
-
SET LOCAL
phù hợp và được ưu tiên cho việc này.Không có cách nào để làm điều đó trong văn bản của truy vấn, nó phải là một câu lệnh riêng biệt.
Bài đăng trong danh sách gửi thư mà bạn liên kết đến là một đề xuất cho một cú pháp tưởng tượng chưa bao giờ được triển khai (ít nhất là trong bản phát hành PostgreSQL công khai) và không tồn tại.
Trong tình huống như thế này, bạn có thể muốn xem xét "điều khiển đồng thời lạc quan", thường được gọi là "khóa lạc quan". Nó cho phép bạn kiểm soát tốt hơn hành vi khóa với chi phí tăng tỷ lệ lặp lại truy vấn và nhu cầu logic ứng dụng nhiều hơn.