Documentation PostgreSQL 14.22 » Référence » Commandes SQL » SET TRANSACTION

Précédent | Niveau supérieur | Suivant
SET SESSION AUTHORIZATION | Sommaire | SHOW

## SET TRANSACTION

SET TRANSACTION — initialise les caractéristiques de la transaction actuelle

## Synopsis

    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

## Description

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 :

`READ COMMITTED`

  Une instruction ne peut voir que les lignes validées avant qu'elle ne commence. C'est la valeur par défaut.

`REPEATABLE READ`

  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.

`SERIALIZABLE`

  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 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.27.5). 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 `'00000003-0000001B-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.

## Notes

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 ou examiné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 20 fournit de plus amples informations.

Les modes de la transaction en cours peuvent similairement être configurés ou examinés via les paramètres de configuration transaction_isolation, transaction_read_only et transaction_deferrable. Configurer un de ces paramètres agit de la même façon que l'option `SET TRANSACTION` correspondante, avec les mêmes restrictions quand cela peut se faire. Néanmoins, ces paramètres ne peuvent pas être configurés dans le fichier de configuration ou dans tout autre source que du SQL direct.

## Exemples

Pour commencer 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
    --------------------
     00000003-0000001B-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 '00000003-0000001B-1';

## Compatibilité

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