INSERT e serializzazione delle transazioni in PostgreSQL
-
26-09-2019 - |
Domanda
Ho una domanda. livello di isolamento è impostato su serializzabile. Quando l'un utente apre una transazione e inserisce o aggiorna i dati in "tabella 1" e poi un altro utente apre una transazione e cerca di dati Inserisci per lo stesso tavolo, fa la seconda esigenza all'utente di attendere 'til il primo utente si impegna la transazione?
Soluzione
In generale, no. La seconda operazione sta inserendo solo, quindi a meno che ci sia un controllo indice univoco o altro trigger che deve avvenire, i dati possono essere inseriti senza condizioni. Nel caso di un indice univoco (compresa chiave primaria), bloccherà quando le prestazioni aggiornano le righe con lo stesso valore, per esempio:.
-- Session 1 -- Session 2
CREATE TABLE t (x INT PRIMARY KEY);
BEGIN;
INSERT INTO t VALUES (1);
BEGIN;
INSERT INTO t VALUES (1); -- blocks here
COMMIT;
-- finally completes with duplicate key error
Le cose sono meno evidenti nel caso di aggiornamenti che possono influenzare gli inserimenti dalla altra transazione. Capisco PostgreSQL non supporta ancora "vero" serialisability in questo caso. Non so come comunemente supportato sia da altri sistemi SQL.
http://www.postgresql.org/docs/current/ interattivo / mvcc.html
Altri suggerimenti
Il secondo utente sarà bloccato fino a quando i primi commit utente o il rollback suo / la sua modifica.