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

Tính nhất quán trong postgresql với khóa và chọn để cập nhật

BEGIN; 
LOCK TABLE slots IN ACCESS EXCLUSIVE MODE; 
UPDATE slots SET job_name = '111' WHERE id IN (SELECT id FROM slots WHERE job_name IS NULL LIMIT 1) RETURNING *;
COMMIT;

Điều này dường như hoạt động trong Đã đọc cam kết. Nó chỉ là sql (giống như mã của bạn) và có thể được thực thi trong một lần gọi (nhanh hơn).

@Seth Robertson:Sẽ không an toàn nếu không có BẢNG KHÓA và không có vòng lặp while.

Nếu có giao dịch A và giao dịch B đồng thời:A sẽ chọn hàng đầu tiên và B sẽ chọn hàng đầu tiên. A sẽ khóa và cập nhật hàng, B phải đợi cho đến khi A cam kết. Sau đó B sẽ kiểm tra lại điều kiện job_name IS NULL. Nó sai và B sẽ không cập nhật - B sẽ không chọn hàng tiếp theo mà chỉ kiểm tra lại và trả về kết quả trống.

@joegester:CHỌN CẬP NHẬT không phải là vấn đề vì tất cả bảng đều bị khóa.

Có thể có một cách khác để thực hiện công việc - nếu bạn xóa và chèn các hàng (trong bảng khác?) Thay vì đặt NULL. Nhưng tôi không chắc làm thế nào.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách date_trunc () hoạt động trong PostgreSQL

  2. cài đặt các gói từ docker-compost.yml vào vùng chứa docker

  3. SQLAlchemy func.count trên cột boolean

  4. Làm thế nào để truy vấn giá trị null trong trường json loại postgresql?

  5. Sự cố với createb trong postgres