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.