PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Kiểm soát thời gian chờ khóa PostgreSQL

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 .

  1. 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ếu statement_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.

  2. 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.

  3. Không. Bạn phải:

    BEGIN;
    SET LOCAL lock_timeout = '4s';
    SELECT ....;
    COMMIT;
    
  4. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. không thể lưu trữ 0 hoặc 1 dưới dạng boolean laravel postgresql

  2. Có cách nào để lấy pg_dump loại trừ một chuỗi cụ thể không?

  3. Làm cách nào để tạo INTERSECT bằng Eloquent Builder mà không cần có bộ sưu tập

  4. Triển khai các ngày bị chặn cho mô hình ORM sự kiện người dùng

  5. PostgreSQL chạy chậm? Mẹo &Thủ thuật để Truy cập Nguồn