© Éditions Eyrolles
247
chapitre n° 7
Programmation avancée
Accès concurrents (FOR UPDATE)
Si vous voulez verrouiller les lignes d’une table interrogée par un curseur dans le but de mettre
à jour la table, sans qu’un autre utilisateur ne la modifie en même temps, il faut utiliser la
clause FOR UPDATE. Elle s’emploie lors de la déclaration du curseur et verrouille les lignes
concernées dès l’ouverture du curseur. Les verrous sont libérés à la fin de la transaction.
Il est souvent intéressant de pouvoir modifier facilement la ligne courante d’un curseur
(UPDATE ou DELETE) à répercuter au niveau de la table. Il est conseillé d’utiliser un curseur
FOR UPDATE pour verrouiller les lignes à actualiser.
Le tableau suivant décrit un bloc qui se sert du curseur FOR UPDATE pour :
q
augmenter le nombre d’heures de 100 pour les pilotes de la compagnie de code 'AF' ;
q
diminuer ce nombre de 100 pour les pilotes de la compagnie de code 'SING' ;
q
supprimer les pilotes des autres compagnies.
Tableau 7-7 Curseur avec verrouillage explicite
Code MySQL
Commentaires
BEGIN
DECLARE fincurs BOOLEAN DEFAULT 0;
DECLARE v_brevet VARCHAR(6);
DECLARE v_nbHv
DECIMAL(7,2);
DECLARE v_comp
VARCHAR(4);
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET fincurs := 1;
SET AUTOCOMMIT = 0;
OPEN curs;
FETCH curs INTO v_brevet,v_nbHv,v_comp;
WHILE (NOT fincurs) DO
IF (v_comp='AF') THEN
UPDATE bdsoutou.Pilote
SET nbHVol = nbHVol + 100
WHERE brevet = v_brevet;
ELSEIF (v_comp='SING') THEN
UPDATE bdsoutou.Pilote
SET nbHVol = nbHVol - 100
WHERE brevet = v_brevet;
ELSE
DELETE FROM bdsoutou.Pilote
WHERE brevet = v_brevet;
END IF;
FETCH curs INTO v_brevet,v_nbHv,v_comp;
END WHILE;
CLOSE curs;
COMMIT;
Déclaration du curseur avec verrou.
Chargement et parcours du curseur.
Mise à jour de la table Pilote par
l’intermédiaire du curseur.
Validation de la transaction.
Web
DECLARE curs CURSOR FOR
SELECT brevet,nbHVol,comp
FROM bdsoutou.Pilote FOR UPDATE;
247
chapitre n° 7
Programmation avancée
Accès concurrents (FOR UPDATE)
Si vous voulez verrouiller les lignes d’une table interrogée par un curseur dans le but de mettre
à jour la table, sans qu’un autre utilisateur ne la modifie en même temps, il faut utiliser la
clause FOR UPDATE. Elle s’emploie lors de la déclaration du curseur et verrouille les lignes
concernées dès l’ouverture du curseur. Les verrous sont libérés à la fin de la transaction.
Il est souvent intéressant de pouvoir modifier facilement la ligne courante d’un curseur
(UPDATE ou DELETE) à répercuter au niveau de la table. Il est conseillé d’utiliser un curseur
FOR UPDATE pour verrouiller les lignes à actualiser.
Le tableau suivant décrit un bloc qui se sert du curseur FOR UPDATE pour :
q
augmenter le nombre d’heures de 100 pour les pilotes de la compagnie de code 'AF' ;
q
diminuer ce nombre de 100 pour les pilotes de la compagnie de code 'SING' ;
q
supprimer les pilotes des autres compagnies.
Tableau 7-7 Curseur avec verrouillage explicite
Code MySQL
Commentaires
BEGIN
DECLARE fincurs BOOLEAN DEFAULT 0;
DECLARE v_brevet VARCHAR(6);
DECLARE v_nbHv
DECIMAL(7,2);
DECLARE v_comp
VARCHAR(4);
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET fincurs := 1;
SET AUTOCOMMIT = 0;
OPEN curs;
FETCH curs INTO v_brevet,v_nbHv,v_comp;
WHILE (NOT fincurs) DO
IF (v_comp='AF') THEN
UPDATE bdsoutou.Pilote
SET nbHVol = nbHVol + 100
WHERE brevet = v_brevet;
ELSEIF (v_comp='SING') THEN
UPDATE bdsoutou.Pilote
SET nbHVol = nbHVol - 100
WHERE brevet = v_brevet;
ELSE
DELETE FROM bdsoutou.Pilote
WHERE brevet = v_brevet;
END IF;
FETCH curs INTO v_brevet,v_nbHv,v_comp;
END WHILE;
CLOSE curs;
COMMIT;
Déclaration du curseur avec verrou.
Chargement et parcours du curseur.
Mise à jour de la table Pilote par
l’intermédiaire du curseur.
Validation de la transaction.
Web
DECLARE curs CURSOR FOR
SELECT brevet,nbHVol,comp
FROM bdsoutou.Pilote FOR UPDATE;
