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
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 et le mode d'accès de la transaction (lecture/écriture ou lecture seule).
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.
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 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 12, 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.
Si SET TRANSACTION est exécuté sans START TRANSACTION ou BEGIN préalable, il est sans effet car la transaction se termine immédiatement.
Il est possible de se dispenser de 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 .) Les valeurs par défaut peuvent ainsi être initialisées dans le fichier de configuration, via ALTER DATABASE , etc. Chapitre 17, Configuration du serveur fournit de plus amples informations.
Les deux commandes sont définies dans le standard SQL. SERIALIZABLE y est le niveau d'isolation par défaut de la transaction. Dans PostgreSQL™, la valeur par défaut est habituellement READ COMMITTED, mais elle peut être modifiée comme cela est mentionné ci-dessus. À défaut d'un prédicat vérouillé, le niveau SERIALIZABLE n'est pas vraiment sérialisable. Voir Chapitre 12, Contrôle d'accès simultané 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 n'est valable que pour le SQL embarqué et, de fait, n'est pas implanté 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.