- Catégories :
FOR UPDATE¶
Verrouille les lignes sélectionnées par la requête jusqu’à ce que la transaction contenant la requête soit validée ou abandonnée.
Cette clause ne peut être utilisée que pour les tables hybrides et est utile pour les charges de travail transactionnelles dans lesquelles plusieurs transactions tentent d’accéder aux mêmes lignes en même temps. Les lignes sont verrouillées contre la mise à jour en ce sens que d’autres transactions ne peuvent pas écrire de données sur ces lignes tant que la transaction qui effectue le verrouillage n’a pas été entièrement validée ou annulée. Toutefois, d’autres transactions peuvent lire les lignes verrouillées et d’autres lignes de la même table peuvent être lues, mises à jour ou supprimées.
SELECT ...
FROM ...
[ ... ]
FOR UPDATE [ NOWAIT | WAIT <wait_time> ]
Paramètres¶
NOWAIT
Renvoie une erreur si la transaction ne peut pas verrouiller immédiatement les lignes sélectionnées. NOWAIT est défini par défaut.
WAIT wait_time
Spécifie le temps maximal (en secondes) pendant lequel la requête attend d’acquérir des verrous au niveau de la ligne. Si le délai d’attente expire, la requête renvoie une erreur.
Restrictions¶
Clause FORUPDATE.
Ne peut pas être utilisé avec les transactions AUTOCOMMIT.
Doit être la dernière clause de l”instruction SELECT.
Ne peut pas être utilisé dans une instruction CTAS.
Ne peut pas être utilisé à l’intérieur de sous-requêtes.
Sélection impossible à partir de plusieurs tables (jointures) ou opérations d’ensemble.
Ne peut pas être utilisé lorsque la requête contient :
Notes sur l’utilisation¶
Étant donné que les tables hybrides prennent en charge le niveau d’isolation READ COMMITTED, les clauses FOR UPDATE ne garantissent pas la stabilité de lecture. Par exemple, supposons qu’une table T
avec une seule colonne nommée ID
contienne deux lignes avec les valeurs 5
et 10
.
La requête suivante est exécutée dans la transaction
T1
:SELECT * FROM T WHERE ID < 20 FOR UPDATE;
La requête renvoie les valeurs
5
et10
et verrouille ces deux lignes.Une autre transaction,
T2
, exécute l’opération DELETE suivante :DELETE FROM T WHERE ID = 5;
La transaction
T2
doit attendre queT1
se termine (c’est-à-dire qu’elle soit validée ou annulée).Toutefois, une troisième transaction,
T3
, peut effectuer l’opération INSERT suivante :INSERT INTO T VALUES 12;
Une requête ultérieure dans
T1
renvoie maintenant trois valeurs (lignes) et non deux :5
,10
et12
:SELECT * FROM T WHERE ID < 20;
Exemples¶
Ouvrez une nouvelle transaction, sélectionnez toutes les lignes d’une table hybride (ht
) et verrouillez ces lignes jusqu’à ce que la transaction soit validée. Mettez à jour certaines lignes sélectionnées et exécutez une autre requête avant de valider la transaction.
BEGIN;
...
SELECT * FROM ht ORDER BY c1 FOR UPDATE;
...
UPDATE ht set c1 = c1 + 10 WHERE c1 = 0;
...
SELECT ... ;
...
COMMIT;
Appliquez un temps d’attente maximal de 60 secondes pour le verrouillage des lignes :
BEGIN;
...
SELECT * FROM ht FOR UPDATE WAIT 60;
...
COMMIT;