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

Khóa cho CHỌN để một quy trình khác không lấy dữ liệu cũ

Câu hỏi của bạn, tham chiếu đến một nguồn không xác định:

Tôi đã xem xét việc khóa hàng, nhưng nó cho biết bạn không thể ngăn các trạng thái lựa chọn có vẻ như nó sẽ không hoạt động đối với tình trạng của tôi ở đây. Có phải lựa chọn duy nhất của tôi để sử dụng khóa tư vấn không?

Tài liệu chính thức về vấn đề này:

Khóa cấp hàng không ảnh hưởng đến truy vấn dữ liệu; họ chỉ chặn nhà văn và tủ khóa vào cùng một hàng.

Các lần thử đồng thời sẽ không chỉ chọn mà còn cố gắng thực hiện cùng một khóa cấp hàng với SELECT ... FOR UPDATE - khiến họ phải đợi bất kỳ giao dịch nào trước đó đang giữ khóa trên cùng một hàng để cam kết hoặc quay trở lại. Đúng như những gì bạn muốn.

Tuy nhiên , nhiều trường hợp sử dụng được giải quyết tốt hơn với khóa tư vấn - trong các phiên bản trước 9.5. Bạn vẫn có thể khóa các hàng đang được xử lý bằng FOR UPDATE bổ sung để được an toàn. Nhưng nếu giao dịch tiếp theo chỉ muốn xử lý "hàng miễn phí tiếp theo" thì thường là nhiều hiệu quả hơn là không phải đợi cùng một hàng, điều này gần như chắc chắn không có sau khi khóa được phát hành, nhưng hãy chuyển sang "miễn phí tiếp theo" ngay lập tức.

Trong Postgres 9.5+, hãy xem xét FOR UPDATE SKIP LOCKED cho điều này. Giống như @Craig đã nhận xét, điều này có thể thay thế phần lớn các khóa tư vấn.

Câu hỏi liên quan vấp phải cùng một hiệu suất heo:

  • Hàm thực hiện mãi mãi để chạy cho một số lượng lớn các bản ghi

Giải thích và ví dụ về mã cho các khóa tư vấn hoặc FOR UPDATE SKIP LOCKED trong Postgres 9.5+:

  • CẬP NHẬT Postgres ... LIMIT 1

Để khóa nhiều hàng cùng một lúc :

  • Cách đánh dấu nr hàng nhất định trong bảng khi truy cập đồng thời


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để lấy tên múi giờ hiện tại trong Postgres 9.3?

  2. Cloud9 postgres

  3. Làm cách nào để bạn thay đổi mã hóa ký tự của cơ sở dữ liệu postgres?

  4. Tìm nạp các bản ghi khác 0 sau dấu thập phân trong PostgreSQL

  5. Làm thế nào để có được ngày hôm qua trong PostgreSQL