SET TRANSACTION — initialise les caractéristiques de la transaction actuelle
SET TRANSACTIONmode_transaction
[, ...] SET TRANSACTION SNAPSHOTid_snapshot
SET SESSION CHARACTERISTICS AS TRANSACTIONmode_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 :
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
, MERGE
,
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
, MERGE
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
, MERGE
, 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 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.
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';
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.