SET TRANSACTION — initialise les caractéristiques de la transaction actuelle
SET TRANSACTION mode_transaction [, ...]
SET TRANSACTION SNAPSHOT id_snapshot
SET SESSION CHARACTERISTICS AS TRANSACTION mode_transaction [, ...]
où mode_transaction fait
partie de :
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
La commande SET TRANSACTION initialise les caractéristiques de la transaction courante. Elle est sans effet sur les transactions suivantes. SET SESSION CHARACTERISTICS positionne les caractéristiques par défaut pour toutes les transactions à venir d'une session. Ces valeurs peuvent ensuite être surchargées par SET TRANSACTION pour une transaction particulière.
Les caractéristiques de transaction disponibles sont le niveau d'isolation, le mode d'accès de la transaction (lecture/écriture ou lecture seule) et le mode différable. De plus, un snapshot peut être sélectionné, bien que pour la transaction en cours, et non pas pour la session.
Le niveau d'isolation détermine les données que la transaction peut voir quand d'autres transactions fonctionnent concurrentiellement :
Une instruction ne peut voir que les lignes validées avant qu'elle ne commence. C'est la valeur par défaut.
Toute instruction de la transaction en cours ne peut voir que les lignes validées avant que la première requête ou instruction de modification de données soit exécutée dans cette transaction.
Toutes les requêtes de la transaction en cours peuvent seulement voir les lignes validées avant l'exécution de la première requête ou instruction de modification de données de cette transaction. Si un ensemble de lectures et écritures parmi les transactions sérialisables concurrentes créait une situation impossible à obtenir avec une exécution en série (une à la fois) de ces transactions, l'une d'entre elles sera annulée avec une erreur serialization_failure.
Le standard SQL définit un niveau supplémentaire, READ UNCOMMITTED. Dans PostgreSQL™, READ UNCOMMITTED est traité comme READ COMMITTED.
Le niveau d'isolation de la transaction ne peut plus être modifié après l'exécution de la première requête ou instruction de modification de données (SELECT, INSERT, DELETE, UPDATE, FETCH ou COPY) d'une transaction. Voir Chapitre 13, Contrôle d'accès simultané pour plus d'informations sur l'isolation et le contrôle de concurrence.
La méthode d'accès de la transaction détermine si elle est en lecture/écriture ou en lecture seule. Lecture/écriture est la valeur par défaut. Quand une transaction est en lecture seule, les commandes SQL suivantes sont interdites : INSERT, UPDATE, DELETE et COPY FROM si la table modifiée n'est pas temporaire ; toutes les commandes CREATE, ALTER et DROP ; COMMENT, GRANT, REVOKE, TRUNCATE ; EXPLAIN ANALYZE et EXECUTE si la commande exécutée figure parmi celles listées plus haut. C'est une notion de haut niveau de lecture seule qui n'interdit pas toutes les écritures sur disque.
La propriété DEFERRABLE d'une transaction n'a pas d'effet tant que la transaction est aussi SERIALIZABLE et READ ONLY. Quand ces trois propriétés sont sélectionnées pour une transaction, la transaction pourrait bloquer lors de la première acquisition de son image de la base, après quoi il est possible de fonctionner sans la surcharge normale d'une transaction SERIALIZABLE et sans risque de contribuer ou d'être annulé par un échec de sérialisation. Ce mode convient bien à l'exécution de longs rapports ou à la création de sauvegardes.
La commande SET TRANSACTION SNAPSHOT permet à une nouvelle transaction de s'exécuter avec le même snapshot que celle d'une transaction existante. La transaction pré-existante doit avoir exportée son snapshot avec la fonction pg_export_snapshot (voir Section 9.26.5, « Fonctions de synchronisation des images de base »). Cette fonction renvoie un identifiant de snapshot, qui doit être fourni à SET TRANSACTION SNAPSHOT pour indiquer le snapshot à importer. L'identifiant doit être écrit sous la forme d'une chaîne litérale dans cette commande, par exemple '000003A1-1'. SET TRANSACTION SNAPSHOT peut seulement être exécuté au début d'une transaction, avant la première requête ou la première instruction de modification de données (SELECT, INSERT, DELETE, UPDATE, FETCH ou COPY) de la transaction. De plus, la transaction doit déjà être configurée au niveau d'isolation SERIALIZABLE ou REPEATABLE READ (sinon le snapshot sera immédiatement annulé car le mode READ COMMITTED prend un nouveau snapshot pour chaque commande). Si la transaction d'import utilise le niveau d'isolation SERIALIZABLE, la transaction qui a exporté le snapshot doit aussi utiliser ce niveau d'isolation. De plus, une transaction sérialisable en lecture/écriture ne peut pas importer un snapshot à partir d'une transaction en lecture seule.
Si SET TRANSACTION est exécuté sans START TRANSACTION ou BEGIN préalable, il n'a aucun effet et un avertissement est renvoyé.
Il est possible de se dispenser de SET TRANSACTION en spécifiant le mode_transaction désiré dans BEGIN ou START TRANSACTION. Mais cette option n'est pas disponible pour SET TRANSACTION SNAPSHOT.
Les modes de transaction par défaut d'une session peuvent aussi être configurés en initialisant les paramètres de configuration default_transaction_isolation, default_transaction_read_only et default_transaction_deferrable. (En fait, SET SESSION CHARACTERISTICS est un équivalent verbeux de la configuration de ces variables avec SET.) Les valeurs par défaut peuvent ainsi être initialisées dans le fichier de configuration, via ALTER DATABASE, etc. Chapitre 18, Configuration du serveur fournit de plus amples informations.
Pour commancer une nouvelle transaction avec le même snapshot qu'une autre transaction en cours d'exécution, commencez par exporter le snapshot de la transaction existante. Cela renvoie un identifiant de snapshot, par exemple :
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT pg_export_snapshot(); pg_export_snapshot -------------------- 000003A1-1 (1 row)
Ensuite, donnez l'identifiant de snapshot dans une commande SET TRANSACTION SNAPSHOT au début de la nouvelle transaction :
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET TRANSACTION SNAPSHOT '000003A1-1';
Ces commandes sont définies dans le standard SQL, sauf en ce qui concerne le mode de transaction DEFERRABLE et la forme SET TRANSACTION SNAPSHOT, qui sont des extensions de PostgreSQL™.
SERIALIZABLE est le niveau d'isolation par défaut dans le standard. Dans PostgreSQL™, le niveau par défaut est d'habitude READ COMMITTED mais il est possible de le modifier comme indiqué ci-dessus.
Dans le standard SQL, il existe une autre caractéristique de transaction pouvant être configurée avec ces commandes : la taille de l'aire de diagnostique. Ce concept est spécifique au SQL embarqué et, du coup, n'est pas implémenté dans PostgreSQL™.
Le standard SQL requiert des virgules entre des transaction_modes successifs mais, pour des raisons historiques, PostgreSQL™ autorise de ne pas mettre de virgules.