PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

INSERT und Transaktionsserialisierung in PostreSQL

Generell nein. Die zweite Transaktion ist nur das Einfügen, sodass die Daten bedingungslos eingefügt werden können, es sei denn, es gibt eine eindeutige Indexprüfung oder einen anderen Auslöser, der stattfinden muss. Im Fall eines eindeutigen Index (einschließlich Primärschlüssel) wird er blockiert, wenn beide Transaktionen Zeilen mit demselben Wert aktualisieren, z. B.:

-- 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

Im Fall von Aktualisierungen, die Einfügungen durch die andere Transaktion beeinflussen können, sind die Dinge weniger offensichtlich. Ich verstehe, dass PostgreSQL in diesem Fall noch keine "echte" Serialisierbarkeit unterstützt. Ich weiß nicht, wie häufig es von anderen SQL-Systemen unterstützt wird.

Siehe http://www.postgresql.org/docs/current/interactive/ mvcc.html