J’ai une requête de mise à jour portant sur un fichier de travail (dont aucun enregistrement n’est verrouillé) filtrant les enregistrements avec une sous-requête dont le résultat contient des enregistrements verrouillés par un autre travail :
exec sql
UPDATE SESSION.BWRBCP AS W SET (W.CODANO) = ('NOU')
WHERE W.ANCUEX = :ANCUEX AND
W.CODANO = ' ' AND
EXISTS
(SELECT *
FROM BCPTCP AS C
WHERE C.CODUEX = W.NOUUEX AND
C.NUMCHA = W.NOUCHA AND
C.NUMTRA = W.NOUTRA AND
C.NBATIM = W.NBANOU AND
C.NESCAL = W.NESNOU AND
C.NETAGE = W.NETNOU AND
C.NPOSIT = W.NPONOU AND
C.NPTCPT = W.NPTNOU)
WITH UR;
J’ai remarqué que l’exécution plantait avec le code erreur SQLCODE = ‑913 au bout d’une minute.
Comme le verrouillage d’enregistrement portait sur la table BCPTCP, j’ai essayé de réduire le temps d’attente en exécutant auparavant la commande de substitution OVRDBF FILE(BCPTCP) WAITRCD(5) OVRSCOPE(*JOB).
Je suis certain que cette substitution s’applique car si j’essaie de l’utiliser pour désigner un autre fichier cela fonctionne.
Pourtant le temps d’attente reste d’une minute (temps d’attente par défaut pour les enregistrements de la base de données). Pourquoi ?
Tout d’abord il faut remarquer que seuls 5 paramètres de la commande OVRDBF s’appliquent à une instruction SQL :
- TOFILE
- MBR
- SEQONLY
- INHWRT
- WAITRCD
Voir : https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzajp/rzajprunningoverride.htm
Si un autre paramètre est utilisé, par exemple WAITFILE, les autres paramètres ne sont plus pris en compte.
Par ailleurs, bien que le fichier mis à jour ne comporte aucun enregistrement verrouillé au moment du lancement de l’instruction, c’est sur lui que doit porter la substitution :
OVRDBF FILE(BWRBCP) WAITRCD(5) OVRSCOPE(*JOB)
Dans ce cas la substitution produit son effet sur l’instruction SQL et le temps d’attente n’est plus que de 5 secondes !