Instruction RPG full free · IBM i (AS/400) · Écriture et contrôle des fichiers
UNLOCK
Libérer le verrou d'un enregistrement
Libère le verrou posé par la dernière lecture sur un fichier en mise à jour, sans modifier l'enregistrement.
Syntaxe
UNLOCK fichier;
UNLOCK(E) fichier;
fichier- Le nom du fichier déclaré par
dcl-favecusage(*update). (E)- Une erreur positionne
%ERRORet%STATUS. - Effet
- L'enregistrement redevient disponible pour les autres accès. Un
UPDATEqui suit échoue avec%STATUS1221.
À quoi ça sert
Sur un fichier ouvert en mise à jour, chaque lecture verrouille l'enregistrement. Si l'on décide finalement de ne pas le modifier, il reste verrouillé tant qu'on n'a pas lu un autre enregistrement ou terminé le programme. Pendant ce temps, les autres utilisateurs patientent, puis reçoivent une erreur.
UNLOCK rend l'enregistrement tout de suite. C'est le réflexe à avoir dès qu'une validation refuse la modification, ou dans un programme interactif entre la lecture et l'attente de l'utilisateur.
Exemple 1 : Deux accès, un verrou
**free
// UNLOCK : liberer le verrou d'un enregistrement lu sans le modifier.
ctl-opt dftactgrp(*no) actgrp(*new);
// Meme table ouverte deux fois, sous deux noms : deux "utilisateurs" qui se disputent un client.
dcl-f clientw usage(*update) keyed usropn extdesc('JOBISQL/CLIENTW') extfile(*extdesc);
dcl-f autre usage(*update) keyed usropn prefix('A_')
extdesc('JOBISQL/CLIENTW') extfile(*extdesc) rename(clientwr : autrer);
dcl-pr qcmdexc extpgm('QCMDEXC');
cmd char(200) const;
lng packed(15:5) const;
end-pr;
// On n'attend le verrou que 2 secondes au lieu de 60.
qcmdexc('OVRDBF FILE(CLIENTW) TOFILE(JOBISQL/CLIENTW) WAITRCD(2)' : 200);
open clientw;
open autre;
chain (100) clientw;
snd-msg 'Utilisateur 1 lit le client 100 : [' + %trim(nom) + ']';
chain(e) (100) autre;
snd-msg 'Utilisateur 2, verrou pris : erreur = ' + %char(%error)
+ ', statut = ' + %char(%status(autre));
// L'utilisateur 1 renonce a modifier : UNLOCK rend l'enregistrement disponible.
unlock clientw;
chain(e) (100) autre;
snd-msg 'Utilisateur 2, apres UNLOCK : erreur = ' + %char(%error) + ', [' + %trim(a_nom) + ']';
unlock autre;
close clientw;
close autre;
qcmdexc('DLTOVR FILE(CLIENTW)' : 200);
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Utilisateur 1 lit le client 100 : [Dupont SA]
Utilisateur 2, verrou pris : erreur = 1, statut = 1299
Utilisateur 2, apres UNLOCK : erreur = 0, [Dupont SA]
La table est ouverte deux fois, sous deux noms (clientw et autre), pour simuler deux utilisateurs. Tant que le premier tient le client 100, le second échoue (statut 1299, après les 2 secondes d'attente fixées par OVRDBF … WAITRCD(2)). Après unlock clientw;, le second le lit sans problème.
Exemple 2 : Après UNLOCK, plus de UPDATE
**free
// UNLOCK : apres la liberation, plus de modification possible sur cette lecture.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);
dcl-f clientw usage(*update) keyed usropn extdesc('JOBISQL/CLIENTW') extfile(*extdesc);
dcl-f autre usage(*update) keyed usropn prefix('A_')
extdesc('JOBISQL/CLIENTW') extfile(*extdesc) rename(clientwr : autrer);
dcl-pr qcmdexc extpgm('QCMDEXC');
cmd char(200) const;
lng packed(15:5) const;
end-pr;
qcmdexc('OVRDBF FILE(CLIENTW) TOFILE(JOBISQL/CLIENTW) WAITRCD(2)' : 200);
open clientw;
open autre;
// Un UPDATE apres UNLOCK est refuse : le verrou n'existe plus.
chain (200) clientw;
unlock clientw;
update(e) clientwr;
snd-msg 'UPDATE apres UNLOCK : erreur = ' + %char(%error) + ', statut = ' + %char(%status(clientw));
// Lire l'enregistrement suivant libere aussi le verrou du precedent.
chain (200) clientw;
read clientw;
chain(e) (200) autre;
snd-msg 'Apres READ, l''autre lit 200 : erreur = ' + %char(%error);
unlock autre;
// Tant que le client 400 reste verrouille, l'autre acces echoue (RNQ1299, CPF5032).
chain (400) clientw;
chain (400) autre;
snd-msg 'Cette ligne ne s''affiche pas';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
UPDATE apres UNLOCK : erreur = 1, statut = 1221
Apres READ, l'autre lit 200 : erreur = 0
Erreur : RNQ1299 - Erreur d'E-S CPF5032 détectée sur fichier AUTRE.
Un UPDATE juste après UNLOCK donne le statut 1221 : le verrou n'existe plus. Le même exemple montre que lire l'enregistrement suivant libère aussi le précédent. Le client 400 reste verrouillé, et l'autre accès échoue avec RNQ1299 (CPF5032).
Le piège
Un enregistrement lu reste verrouillé. Un CHAIN sur un fichier en mise à jour verrouille même si vous ne modifiez rien, et l'autre accès reçoit l'erreur RNQ1299 avec CPF5032 à la fin du délai d'attente (exemple 2). Appelez UNLOCK dès que vous renoncez à modifier.