Catégories :

Syntaxe de requête

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> ]
Copy

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.

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.

  1. La requête suivante est exécutée dans la transaction T1 :

    SELECT * FROM T WHERE ID < 20 FOR UPDATE;
    
    Copy

    La requête renvoie les valeurs 5 et 10 et verrouille ces deux lignes.

  2. Une autre transaction, T2, exécute l’opération DELETE suivante :

    DELETE FROM T WHERE ID = 5;
    
    Copy

    La transaction T2 doit attendre que T1 se termine (c’est-à-dire qu’elle soit validée ou annulée).

  3. Toutefois, une troisième transaction, T3, peut effectuer l’opération INSERT suivante :

    INSERT INTO T VALUES 12;
    
    Copy
  4. Une requête ultérieure dans T1 renvoie maintenant trois valeurs (lignes) et non deux : 5, 10 et 12 :

    SELECT * FROM T WHERE ID < 20;
    
    Copy

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;
Copy

Appliquez un temps d’attente maximal de 60 secondes pour le verrouillage des lignes :

BEGIN;
...
SELECT * FROM ht FOR UPDATE WAIT 60;
...
COMMIT;
Copy