Operasi UPSERT PostgreSQL dan Klausa KEMBALI: Mengendalikan Konflik
PostgreSQL INSERT ... ON CONFLICT
menyediakan fungsi upsert, menggabungkan sisipan dan kemas kini. Walau bagaimanapun, penggunaan DO NOTHING
dengan klausa RETURNING
boleh membawa kepada hasil yang tidak lengkap dalam senario serentak.
Masalah Konkurensi 1: Baris Dikembalikan Hilang
Jika transaksi lain mengubah suai baris sasaran sebelum INSERT ... ON CONFLICT
anda selesai, upsert mungkin tidak mengesan konflik, mengakibatkan baris hilang dalam output RETURNING
.
Penyelesaian:
Beberapa pendekatan mengurangkan perkara ini:
RETURNING
. Percanggahan menunjukkan baris yang hilang, mendorong pelaksanaan semula pernyataan.Masalah Concurrency 2: Penguncian Baris
Untuk transaksi yang memerlukan kunci baris, gunakan ON CONFLICT DO UPDATE
dengan WHERE FALSE
. Ini mengunci baris tanpa mengubahnya. Gabungkan ini dengan SELECT ... FOR UPDATE
untuk penguncian tambahan.
Pengendalian dan Penghantaran Jenis Data untuk Kemantapan
Penyelesaian sedia ada tidak mencukupi untuk semua senario serentak. Pendekatan yang lebih komprehensif melibatkan:
Persamaan Rendah:
INSERT
dan SELECT UNION
untuk membezakan antara baris yang disisipkan dan yang dipilih.Keselarasan Tinggi:
INSERT ... ON CONFLICT
CTE untuk mengurus konkurensi.Mengelakkan Kebuntuan:
Tertib sisipan yang konsisten meminimumkan kejadian kebuntuan.
Pengurusan Jenis Data:
Atas ialah kandungan terperinci Bagaimana untuk Menjamin Keputusan Konsisten daripada Operasi UPSERT PostgreSQL dengan RETURNING?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!