UPDATE senza la clausola WHERE blocca una tabella in PostgreSQL?


9

L'intera tabella UPDATE(senza specificare la WHEREclausola) blocca una tabella in PostgreSQL? Ad esempio, impedisce che le righe vengano eliminate / inserite?

Ad esempio, se corro UPDATE t1 SET key = 'value' Posso aspettarmi che non vengano inserite nuove righe t1durante l' UPDATEesecuzione?

Se no, posso aspettarmi UPDATEche aggiornerà anche le righe visualizzate dopo il suo avvio? (chiave non ha DEFAULT 'value'nella sua definizione)


Se stava aggiornando le righe che erano inserite dopo l'avvio e c'era un processo che inseriva continuamente le righe non significherebbe che l'istruzione di aggiornamento non sarebbe mai finita?
Joe W,

buon punto! Sì, è appena possibile UPDATEimplementarlo in modo tale da aggiornare le righe appena inserite.
originale il

No, solo le righe modificate verranno bloccate. Un AGGIORNAMENTO non blocca mai l'intero tavolo.
a_horse_with_no_name

Risposte:


15

Un AGGIORNAMENTO senza una clausola WHERE bloccherà tutte le righe della tabella, ma non bloccherà la tabella stessa per DML.

Le righe non possono essere eliminate da una transazione diversa perché sono bloccate.

Ma puoi inserire nuove righe senza problemi (supponendo che non violino alcun vincolo).

Qualsiasi riga inserita dopo l'UPDATE non verrà visualizzata dall'istruzione UPDATE e quindi non verrà modificata.


puoi per favore condividere i link sui documenti. Non ho trovato molto nella documentazione ufficiale che dicesse esattamente UPDATEsenza WHERE.
origaminal

E anche le righe AGGIORNATE da un'altra transazione falliranno a causa dei blocchi delle righe, giusto?
tale852150,

1
@origaminal Il documento in questione è su postgresql.org/docs/current/explicit-locking.html , gli ultimi quattro sono quelli che chiami "blocchi tabella", sebbene anche i blocchi permissivi siano ancora una forma di blocco tabella che impedire tentativi di blocco esclusivo.
SilverbackNet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.