J'ai une question. Le niveau d'isolation des transactions est défini sur sérialisable. Quand un utilisateur ouvre une transaction et des données INSERT ou UPDATE dans "table1" puis qu'un autre utilisateur ouvre une transaction et essaie d'INSÉRER des données dans la même table, le second utilisateur doit-il attendre jusqu'à ce que le premier utilisateur valide la transaction?SÉRIE INSERT et transaction dans PostreSQL
Répondre
Généralement, non. La seconde transaction est insérée seulement, donc à moins qu'il y ait une vérification d'index unique ou un autre déclencheur qui doit avoir lieu, les données peuvent être insérées sans condition. Dans le cas d'un index unique (y compris la clé primaire), il bloque si les deux opérations sont mise à jour des lignes avec la même valeur, par exemple:
-- 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
Les choses sont moins évidentes dans le cas des mises à jour qui peuvent affecter des insertions par l'autre transaction. Je comprends que PostgreSQL ne supporte pas encore la sérialité "true" dans ce cas. Je ne sais pas à quel point il est couramment supporté par d'autres systèmes SQL.
Voir http://www.postgresql.org/docs/current/interactive/mvcc.html
Le deuxième utilisateur sera bloqué jusqu'à ce que le premier utilisateur valide ou annule ses modifications.
hm .. Donc, si j'avais une clé primaire dans ce tableau sur l'index unique sera effectué et le deuxième utilisateur sera bloqué? – Alexander
Dans mon expérience, beaucoup de tables ont des index uniques. –
la deuxième transaction bloque uniquement parce qu'elle essaie d'insérer une clé en double. Si les clés ne s'affrontaient pas, il n'y aurait pas de blocage. – araqnid