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

Trong PostgreSQL, nhiều CẬP NHẬT cho các hàng khác nhau trong cùng một bảng có khóa xung đột không?

UPDATE khóa hàng, vì vậy bạn không cần phải khóa hàng trước. Nếu bạn cố gắng UPDATE tập hợp các hàng chồng chéo đồng thời, UPDATE thứ hai sẽ đợi giao dịch của người đầu tiên cam kết hoặc quay trở lại.

Vấn đề lớn với cách tiếp cận của bạn - ngoài thực tế là UPDATE không có LIMIT mệnh đề - là nhiều công nhân sẽ cố gắng lấy các hàng giống nhau. Đây là những gì sẽ xảy ra:

  • worker1:Lọc bảng để tìm 200 hàng và khóa chúng
  • worker1:bắt đầu cập nhật các hàng
  • worker2:lọc bảng để tìm 200 hàng
  • worker2:cố gắng bắt đầu cập nhật các hàng, nhưng đã chọn các hàng giống như worker1 nên nó chặn trên khóa của worker1
  • worker1:Hoàn thành việc cập nhật các hàng
  • worker2:Sau khi phát hành khóa, hãy kiểm tra lại điều kiện WHERE và phát hiện ra rằng không có hàng nào khớp nữa vì worker1 đã cập nhật chúng. Cập nhật không có hàng nào.

... và lặp lại!

Bạn cần:

  • hàng đợi trung tâm phân phối các hàng theo cách an toàn đồng thời thích hợp; hoặc
  • Chỉ định cho nhân viên các dải ID không trùng lặp để làm việc

Đối với LIMIT - bạn có thể sử dụng WHERE id IN (SELECT t.id FROM thetable t LIMIT 200 ORDER BY id) - nhưng bạn có cùng vấn đề với cả hai công nhân khi chọn cùng một nhóm hàng để cập nhật.



  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 cài đặt PostgreSQL 9.1 trên OSX Lion

  2. Truy vấn gốc JPA trả về Double hoặc BigDecimal

  3. Tôi có thể thả và tạo db trong khi thực hiện lệnh pg_restore không?

  4. Postgres SQL để truy vấn văn bản mảng [] trong phần tử cụ thể

  5. cách ngăn các bản sao bằng truy vấn nối bên trong (Postgres)