Apakah PEMBARUAN tanpa klausa WHERE mengunci tabel di PostgreSQL?

9

Apakah seluruh tabel UPDATE(tanpa menentukan WHEREklausa) mengunci tabel di PostgreSQL? Misalnya apakah itu mencegah baris dari dihapus / dimasukkan?

Misalnya jika saya menjalankan UPDATE t1 SET key = 'value' Bisakah saya berharap tidak ada baris baru yang akan dimasukkan ke t1dalam UPDATEeksekusi?

Jika tidak, dapatkah saya berharap UPDATEakan memperbarui bahkan baris muncul setelah dimulai? (kunci tidak memiliki DEFAULT 'value'definisi)

origaminal
sumber
Jika memperbarui baris yang disisipkan setelah dimulai dan ada proses yang terus-menerus memasukkan baris, bukankah itu berarti pernyataan pembaruan tidak akan pernah selesai?
Joe W
poin bagus! Ya, hampir tidak mungkin UPDATEdilaksanakan dengan cara seperti itu untuk memperbarui baris yang baru dimasukkan.
origaminal
Tidak, hanya baris yang telah diubah yang akan dikunci. PEMBARUAN tidak pernah mengunci seluruh tabel.
a_horse_with_no_name

Jawaban:

15

UPDATE tanpa klausa WHERE akan mengunci semua baris dalam tabel, tetapi tidak akan mengunci tabel itu sendiri untuk DML.

Baris tidak dapat dihapus dari transaksi yang berbeda karena mereka dikunci.

Tapi Anda bisa memasukkan baris baru tanpa masalah (dengan asumsi mereka tidak melanggar kendala apa pun).

Setiap baris yang dimasukkan setelah UPDATE tidak akan terlihat oleh pernyataan UPDATE dan karenanya tidak akan diubah.

seekor kuda tanpa nama
sumber
bisa tolong bagikan tautan pada dokumen. Saya tidak menemukan banyak dalam dokumentasi resmi mengatakan tentang UPDATEtanpa WHERE.
origaminal
Dan baris DIPERBARUI dari transaksi lain akan gagal juga karena kunci baris, benar?
tale852150
1
@origaminal Doc yang dimaksud adalah di postgresql.org/docs/current/explicit-locking.html , empat terakhir adalah apa yang Anda sebut 'kunci meja' - meskipun bahkan kunci permisif masih berupa kunci meja yang akan mencegah upaya untuk mengambil kunci eksklusif.
SilverbackNet