SET TRANSACTION

Nom

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

Synopsis

SET TRANSACTION mode_transaction [, ...]
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

Description

La commande SET TRANSACTION initialise les caractéristiques de la transaction actuelle. Il n'a aucun effet sur les transactions suivantes. SET SESSION CHARACTERISTICS initialise les caractéristiques de transaction par défaut pour les prochaines transactions d'une session. Ces valeurs peuvent être surchargées par SET TRANSACTION pour une transaction individuelle.

Les caractéristiques disponibles de la transaction sont le niveau d'isolation de la transaction et le mode d'accès de la transaction (lecture/écriture ou lecture seule).

Le niveau d'isolation d'une transaction détermine les données que la transaction peut voir quand d'autres transactions fonctionnent en même temps :

READ COMMITTED

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

SERIALIZABLE

Toutes les instructions de la transaction en cours peuvent seulement voir les lignes validées avant que la première requête ou la première instruction de modification de données ait été exécutée dans cette transaction.

Le standard SQL définit deux niveaux supplémentaires, READ UNCOMMITTED et REPEATABLE READ. Dans PostgreSQL, READ UNCOMMITTED est traité comme READ COMMITTED alors que REPEATABLE READ est traité comme SERIALIZABLE.

Le niveau d'isolation de la transaction ne peut pas être modifié après que la première requête ou la première instruction de modification de données (SELECT, INSERT, DELETE, UPDATE, FETCH ou COPY) d'une transaction ait été exécutée. Voir Chapitre 12 pour plus d'informations sur l'isolation de la transaction et le contrôle de concurrence.

Le mode d'accès de la transaction détermine si la transaction 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 qu'elles modifieraient n'est pas une table temporaire ; toutes les commandes CREATE, ALTER et DROP ; COMMENT, GRANT, REVOKE, TRUNCATE ; EXPLAIN ANALYZE et EXECUTE si la commande qu'ils exécuteraient est parmi celles listées. Ceci est une notion de haut niveau de lecture seule qui n'empêche pas toutes les écritures sur disque.

Notes

Si SET TRANSACTION est exécuté sans un START TRANSACTION ou un BEGIN le précédant, il est sans effet car la transaction se termine immédiatement.

Il est possible de compenser SET TRANSACTION en spécifiant le mode_transaction désiré dans BEGIN ou START TRANSACTION.

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 et default_transaction_read_only. (En fait, SET SESSION CHARACTERISTICS est un équivalent verbeux de la configuration de ces variables avec SET.) Ceci signifie que les valeurs par défaut peuvent être initialisées dans le fichier de configuration, via ALTER DATABASE, etc. Consultez Section 16.4 pour plus d'informations.

Compatibilité

Les deux commandes sont définies dans le standard SQL. SERIALIZABLE est le niveau d'isolation par défaut de la transaction dans le standard. Dans PostgreSQL, la valeur par défaut est habituellement READ COMMITTED, mais vous pouvez la modifier comme mentionné ci-dessus. À cause d'un manque de verrou du prédicat, le niveau SERIALIZABLE n'est pas vraiment sérialisable. Voir Chapitre 12 pour plus de détails.

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 seulement à utiliser en SQL embarqué et, du coup, n'est pas implémenté dans le serveur PostgreSQL.

Le standard SQL requiert des virgules entre chaque mode_transaction mais, pour des raisons historiques, PostgreSQL autorise l'omission des virgules.