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

Tránh bế tắc PostgreSQL khi thực hiện cập nhật hàng loạt và thao tác xóa

Sử dụng khóa cấp độ hàng rõ ràng trong truy vấn phụ có thứ tự trong tất cả các truy vấn cạnh tranh .
(SELECT không cạnh tranh với khóa ghi.)

DELETE

DELETE FROM table_name t
USING (
   SELECT id_A, id_B
   FROM   table_name 
   WHERE  id_A = ANY(array_of_id_A)
   AND    id_B = ANY(array_of_id_B)
   ORDER  BY id_A, id_B
   FOR    UPDATE
   ) del
WHERE  t.id_A = del.id_A
AND    t.id_B = del.id_B;

UPDATE

UPDATE table_name t
SET    val_1 = 'some value'
     , val_2 = 'some value'
FROM  (
   SELECT id_A, id_B
   FROM   table_name 
   WHERE  id_A = ANY(array_of_id_A)
   AND    id_B = ANY(array_of_id_B)
   ORDER  BY id_A, id_B
   FOR    NO KEY UPDATE  -- Postgres 9.3+
-- FOR    UPDATE         -- for older versions or updates on key columns
   ) upd
WHERE  t.id_A = upd.id_A
AND    t.id_B = upd.id_B;

Bằng cách này, các hàng được khóa theo thứ tự nhất quán như đã đề cập trong sách hướng dẫn.

Giả sử rằng id_A , id_B không bao giờ được cập nhật, thậm chí không thể thực hiện được các trường hợp phức tạp ở góc hiếm gặp như được nêu trong ô "Thận trọng" trong sách hướng dẫn.

Trong khi không cập nhật các cột chính, bạn có thể sử dụng chế độ khóa yếu hơn FOR NO KEY UPDATE . Yêu cầu Postgres 9.3 trở lên.

Cái kia ( chậm và chắc chắn) tùy chọn là sử dụng Mức cô lập có thể nối tiếp hóa cho các giao dịch cạnh tranh. Bạn sẽ phải chuẩn bị cho các lỗi tuần tự hóa, trong trường hợp đó, bạn phải thử lại lệnh.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự khác biệt giữa chỉ số GiST và GIN

  2. Làm thế nào để tìm kiếm một giá trị cụ thể trong tất cả các bảng (PostgreSQL)?

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

  4. Làm cách nào để lấy bình luận của cơ sở dữ liệu PostgreSQL?

  5. JPA tuôn ra so với cam kết