You are on page 1of 12

Le COMMIT dans les programmes Batch

Avec DB2
LE COMMIT
DANS LES PRORAMMES BATC!
A"EC DB2
Le prsent document constitue un guide mthodologique de gestion des commits dans les
programmes batch dans un environnement db2.
Il contient un expos des rgles dimplmentation de lordre COMMI et de diverses
implications dans la programmation.
Les rgles exposes visent ! garantir une intgrit des donnes mises ! "ours en cas de
traitement normal et en cas de reprise aprs incident# tout en conservant des ob"ecti$s de
per$ormance.
%rincipe &nral che' ())C *
O+( les programmes batch ralisant des mises ! "our doivent $aire des
commits intermdiaires si leur dure totale de traitement dpasse ,- secondes.
SAM - Support Technique
Copyright SDDC 2004
Page : 1 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
I # DE$INITION
%&% $onct'on
.uand lordre COMMI est donn ! )/2# toutes les mises ! "our e$$ectues dans les tables
)/2
depuis le dernier commit
depuis le dbut du programme# sil sagit du premier commit
sont entrines.
Cest ! dire qu! partir du moment o0 le commit est excut# les mises ! "our qui le
prcdent sont d$initives. 1(au$ ! recourir ! des restaurations de tables ! un point antrieur
par lutilitaire 23CO4325.
ant que le commit na pas t excut 1ou "usqu! la $in du programme5# les mises ! "our
sont rvocables.
%&2 S(nta)e
Cest un ordre (.L# qui dans un programme CO/OL# scrit *
363C (.L COMMI 37)8363C
Ou
363C (.L COMMI 9O2: 37)8363C
La s;ntaxe < COMMI 9O2: = est quivalente ! < COMMI =. Cette s;ntaxe rpond !
des besoins de compatibilit entre le (.L> de )/2 et dautres (.L.
%&* L'm'tat'ons de sa port+e
?ttention. Lordre commit nest pas tolr des environnements IM( ou CIC(. Il est
simplement mis en commentaire par le prcompilateur. Les architectures telles que CIC(
assurent elles m@mes la gestion des mises ! "ours# pour )/2 mais aussi pour lensemble
des ressources accdes 14(?M# etcA5. Cest le 9O %B?(3( COMMI.
Il est ralis par lordre 363C CIC( (C7C%OI7 37)8363C.
%&, COMMIT 'mpl'c'te o- e)pl'c'te
Lordre 363C (.L COMMI ralise un commit explicite.
out processus qui se termine correctement 1ne se terminant pas par un abend5 ralise un
commit implicite.
Il est donc inutile de coder un commit en $in de programme.
?ttention. Le positionnement par programme dun code retour di$$rent de 'ro nannule
pas le commit implicite de $in de programme.
SAM - Support Technique
Copyright SDDC 2004
Page : 2 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
> * (tructured .uer; Language * norme internationale commune 1! nD prs5 ! tous les
(&/).
II . /TILITE # NECESSITE
2&% Cond't'on m'n'male
+n commit nest utile dans un programme que si lui ou un de ses sous8programmes ralise
au moins une mise ! "our sur une table db2.
2&2 In-t'l't+
(i le plan dun programme < lecture seule = est bind avec loption I(OL?IO71C(5
1Cursor (tabilit;# d$aut ())C5# un commit ne sert ! rien# car les pages lues restent
quoiquil arrive accessibles par les autres plans.
(i ce plan est bind avec I(OL?IO71225 12epeatable 2ead5# les pages lues restent
verrouilles pour @tre relues plus rapidement# et interdisent ainsi tout accs concurrent. Le
commit libre les verrous et rend les pages accessibles.
oute$ois# un plan < lecture seule = bind avec I(OL?IO71+25 1+ncommited 2ead#
usuellement dconseill5 ne sera pas victime des verrous poss par dautres plans# avec le
risque de lire des donnes errones ou supprimes.
2&* Pl-s'e-rs o01ect'2s v's+s
2&*&% Ass-rer -ne me'lle-re conc-rrence d3acc4s a-) donn+es des ta0les DB2&
Les donnes modi$ies 1I7(32# +%)?3# )3L335 par un programme sont
verrouilles et inaccessibles# en lecture ou mise ! "our# ! tous les autres plans 1sau$ binds
en +25.
(i elles ne sont pas libres su$$isamment vite# les plans demandeurs reEoivent un sqlcode
FGHH 1)3?)LOC: ou IM3O+ 5 et tombent en principe en abend 1ce point sera
dvelopp plus loin5. (eul le plan <modi$iant = voit les donnes modi$ies# et peut donc les
relire ou les modi$ier de nouveau.
Il est donc imprati$ de$$ectuer des commits $rquents# ! un r;thme in$rieur ! la limite de
timeout 1dure variable selon les db2 et in$rieure ! I- secs5 pour optimiser les accs
concurrentiels.
oute$ois# il convient galement dappliquer certaines rgles# telles que

prohiber les ordres LOC: ?/L3 dans les programmes
viter les binds avec I(OL?IO71225
viter les LOC:(IJ3 ?/L3(%?C3 ou ?/L3
etcA
qui ont pour consquence dannuler les e$$ets du commit.
SAM - Support Technique
Copyright SDDC 2004
Page : 3 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
2&*&2 Acc+l+rer le process-s de reto-r arr'4re 5ROLLBAC67
Il est interdit de laisser un programme raliser des mises ! "our sans commit intermdiaire
pendant un temps trop long. 7ous avons d"! vu que pendant cette priode les pages
modi$ies restaient indisponibles aux autres utilisateurs.
Mais si pour une raison quelconque# abend ou rollbacK programm# le programme doit
revenir en arrire# donc remettre les donnes dans leur tat dorigine# les pages resteront
bloques "usqu! la $in anormale du programme ou "usqu! la complte excution de
lordre 2OLL/?C:.
Classiquement# lannulation par )/2 des modi$ications prend autant de temps que les
modi$ications elles8m@mes. Ce qui doublera le temps dindisponibilit des donnes.
2&*&* Permettre -n red+marrage rap'de de DB2

Lorsque se produit un arr@t inattendu de )/2# tous les processus de mise ! "our en cours au
moment de larr@t seront suivis dun 2OLL/?C: lors du redmarrage. Le )/2 ne sera
disponible# que lorsque tous les processus de 2OLL/?C: seront termins.
On comprend donc que si au moment de larr@t dun )/2# tournait un programme
responsable de millions de mises ! "our# sans commit intermdiaire# depuis des heures# on
risque au redmarrage dattendre autant de temps 1sinon plus5 pour que )/2 puisse
annuler toutes les modi$ications non commites. Cest la totalit du )/2 qui sera cette $ois
indisponible.
Ce dernier point sera amlior avec la 4I de )/2 mais cette perspective nautorise pas
pour autant les mises ! "our sans commit intermdiaire.
SAM - Support Technique
Copyright SDDC 2004
Page : 4 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
III . /NITE LOI8/E DE TRA"AIL . /NITE DE RECO"ER9
*&% L3-n't+ log':-e de trava'l 5L/;7
Lunit logique de travail est constitue dune squence doprations qui sont logiquement
lies entre elles et insparables. Lunit logique de travail est inscable du point de vue
applicati$ pour assurer une cohsion des donnes.
%ar exemple# lenregistrement dune transaction bancaire est une unit logique de travail
constitue de *
la cration du mouvement 1I7(32 dans la table des mouvements5
la mise ! "our du solde du compte 1+%)?3 dans la table des soldes5
Il nest pas concevable de modi$ier le solde sans crer le mouvement ! lorigine de la mise
! "our du solde du compte. Ces deux oprations de mise ! "our sont solidaires# on ne peut
envisager lune sans lautre.
On ne do't pas r+al'ser de comm't a- m'l'e- d3-ne -n't+ log':-e de trava'l&
Lunit logique de travail doit @tre la plus $ine possible.
+n commit ne peut @tre $ait qu! la $in dune unit logique de travail.
+n rollbacK peut survenir au milieu dune unit logique de travail.
*&2 L3-n't+ de resta-rat'on o- -n't+ de RECO"ER9 5/R7
Lunit de restauration ou unit de recover; est constitue dune squence dunits
logiques de travail. Cest cette squence de mises ! "our qui doit @tre globalement entrine
ou re$use.

Chaque squence est dlimite par un commit ou un rollbacK. )ans le cas standard# une
unit de recover; est constitue de ce qui spare deux commits.
Babituellement# dans un contexte transactionnel 1CIC(# etcA5# les notions dunit logique
de travail et dunit de recover; se superposent et se con$ondent. Il nest pas recommand#
en standard# de coder un commitLs;ncpoint dans un programme CIC(.
%ar contre# dans un contexte batch# une unit de recover; correspond souvent ! plusieurs
units logiques de travail. Lexcution du commit gnrant 2 ILO# il peut @tre pnalisant de
raliser des commits trop $rquents.
SAM - Support Technique
Copyright SDDC 2004
Page : 5 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
I" . LES CONSE8/ENCES D/ COMMIT
,&% Les cons+:-ences s-r le s(st4me de verro-'llage
ous les verrous acquis sur les pages de donnes 1ou sur les pages dindex pour les indexes
de t;pe H5 sont librs# sau$ sur celles lies ! la position dun curseur 9IB BOL).
,&2 Les cons+:-ences s-r les a-tres ordres S8L
ous les curseurs ouverts sont automatiquement $erms sau$ ceux dclars avec loption
9IB BOL) M
ous les ordres %23%?23 1sql d;namique5 sont perdus# sau$ si le programme est bind
avec loption :33%)C7?MIC1C3(5.
SAM - Support Technique
Copyright SDDC 2004
Page : 6 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
" # LES IMPLICATIONS DANS LA PRORAMMATION
<&% La ta0le de repr'se
Chaque programme qui ralise des commits doit normalement possder une ligne qui lui
est associe dans une table de reprise.
(i un programme peut sexcuter en < multi8init = ou en < occurrences multiples =# la table
de reprise doit possder autant de lignes associes ! ce programme que le nombre
maximum doccurrences de ce programme.
3n dbut de traitement# le programme doit lire la ligne qui lui est associe dans la table de
reprise# et le cas chant savoir < d;namiquement = retrouver la bonne occurrence. ?insi# il
connaNtra sa cl de repositionnement# et sa $rquence de commit.
? la $in de chaque unit logique de travail# le programme < se demande = sil est utile de
$aire un commit# donc sil est en $in dunit de recover;. (i la rponse est positive# il
commence par mettre ! "our sa ligneLoccurrence de reprise avec la nouvelle valeur de la
cl. Le commit doit @tre excut immdiatement aprs cet +%)?3.
)es prcautions particulires sont prises pour minimiser les risques de contention lors des
mises ! "our sur les tables de reprise *
conserver une ligne de O K 1une page entire5 par ad"onction de $iller.
prohiber le compactage qui annulerait la mesure prcdente
LOC:(IJ3 %?&3 ou LOC:(IJ3 2O9 1verrouillage ! la ligne5
vri$ier dans les explains que les accs ! la table de reprise se $ont par lindex unique#
et que toutes les colonnes sont adresses
considrer la table comme critique du point de vue des per$ormances 1surveillance des
disques# droulement des utilitaires# etcA.5
<&2 # L3opt'on ;IT! !OLD dans les c-rse-rs
Le ou les curseurs# qui sont ouverts pendant lexcution de lordre commit# doivent @tre
dclars 9IB BOL)# ce qui emp@chera leur $ermeture implicite.
Cest au programme de dcider de la $ermeture ou non des curseurs# et de leur rouverture.
Cette option est particulirement utile si# comme cest souvent le cas en batch# louverture
dun curseur est longue et coPteuse. %ar exemple# si les index sont peu ou mal accds# si
des tris 1order b;# group b;# distinct5 sont ncessaires sur un volume important de lignes.
outes ces oprations doivent @tre renouveles ! chaque ouverture de curseur. Loption
9IB BOL) permet de n@tre pnalis quune $ois par le poids du curseur# quel que soit
le nombre de commits.
SAM - Support Technique
Copyright SDDC 2004
Page : 7 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
<&* La cl+ de repr'se . Le repos't'onnement
<&*&% Le repos't'onnement pe-t =tre 2onct'onnellement 'mp+rat'2&
La cl de reprise doit correspondre ! un identi$iant unique du point de vue de lunit
logique de travail. 3lle peut @tre composite.
On doit pouvoir retrouver sans quivoque la dernire unit logique de travail accde lors
du traitement incomplet prcdent.
%ar exemple# un programme doit augmenter les prix de tous les articles de HD.
3n cas dinterruption anormale# il est pr$rable de ne pas rappliquer laugmentation aux
articles d"! traits la $ois prcdente.
%our cela le curseur doit tenir compte du repositionnement.
363C (.L )3CL?23 C+2(QH C+2(O2 9IB BOL) RO2
(3L3C ?2ICL3# %2I6Q4373
R2OM ?/Q?2ICL3
;!ERE ARTICLE > ?DERNIER#ARTICLE#L/
ORDER B9 ARTICLE
37)8363C
<&*&2 Le repos't'onnement pe-t =tre s-per2l-
Certains programmes mettent ! "our ou suppriment les critres de slection du curseur.
%ar exemple# on supprime dune table historique les lignes dont la date de cration est
antrieure ! I mois.
363C (.L )3CL?23 C+2(QH C+2(O2 9IB BOL) RO2
(3L3C )?3QC23?# ?2ICL3
R2OM BI(OQ?2ICL3
;!ERE DATE@CREAT A ?DATE#LIMITE
37)8363C

Il est vident que lors dune reprise du programme aprs un arr@t anormal# les lignes# dont
les dates satis$aisaient ! la condition# napparaNtront plus lors de la nouvelle ouverture du
curseur. Il est donc inutile dimaginer un autre s;stme de reprise.
)e m@me# on extrait dune table toutes lignes insres dans la "ourne et non encore
traites# en positionnant un indicateur de traitement.
363C (.L )3CL?23 C+2(QH C+2(O2 9IB BOL) RO2
(3L3C ?2ICL3# I7)ICQ2?I
R2OM M4Q?2ICL3
;!ERE INDIC@TRAIT B C C
37)8363C
? la relance# les lignes traites prcdemment ne satis$eront pas la condition.
SAM - Support Technique
Copyright SDDC 2004
Page : 8 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
"I . $RE8/ENCE DE COMMIT
D&% Le comm't to-tes les n l'gnes
%ar abus de langage# nous parlerons par$ois dun nombre le lignes# alors quil $aut parler
dun nombre dunits logique de travail.
La mthode# qui semble la plus naturelle# pour dterminer sil $aut excuter un commit ou
non# est de compter les mises ! "our et de se dterminer en $onction dun seuil. 7anmoins#
elle prsente quelques inconvnients.
%our des raisons de charge ou de priorit# dune excution ! lautre un m@me programme
peut mettre plus ou moins de temps ! traiter le m@me volume de < lignes =# et la condition
< cptr S n = peut @tre plus ou moins longue ! satis$aire.
)e m@me# si une condition dextraction est pose sur une colonne non indexe# dont la
dispersion dans la table est $luctuante et alatoire 1ex * %2I6Q4373 S H----5# le volume
de donnes variera dun traitement ! lautre et surtout le temps coul entre deux lignes !
traiter et donc entre deux commits.
D&2 Le comm't to-tes les n secondes
Cest cette solution qui a notre pr$rence# car elle limine presque totalement les
inconvnients ma"eurs exposs plus haut.
7ous recommandons actuellement un commit toutes les T secondes.
)s quune unit logique de travail est accomplie# le programme < se demande = sil sest
coul plus de n secondes depuis le dernier commit. (i cest le cas la squence de commit
sera excut# sinon le programme continue normalement et la prochaine unit logique est
traite# et ainsi de suite "usqu! ce que le seuil soit atteint.
Les commit ! $rquence strictement constante peuvent par$ois prsenter des inconvnients.
Il importe dans certains cas 1tables trs sollicites5 quun commit soit indispensable#
quelles que soient les conditions normales. Il importe donc de pouvoir $orcer un commit.
D&* Le comm't E 2r+:-ence trop +lev+e
7anmoins# si les units logiques de travail sont simples# et quun commit est $orc aprs
chacune delles# la dure elapsed du programme augmentera. 3n e$$et# un commit $orce
dans )/2 deux critures s;nchrones 1)+?L LO&&I7&5 sur les $ichiers de log. Ceci a un
coPt.
+n ratio de plus dun commit par seconde est ! proscrire# sau$ pour la mise ! "our de tables
extr@mement sensibles aux con$lits daccs. Il doit $aire lob"et dun avis des )/?.
SAM - Support Technique
Copyright SDDC 2004
Page : 9 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
"II . STR/CT/RE DES PRORAMMES
F&% Programme ent'4rement DB2
Cest le cas idal. outes les mises ! "our sont alignes sur le m@me point de commit.
La structure gnrale est la suivante *
lecture de la table de reprise# chargement de la cl de reprise
ouverture du curseur maNtre
boucle de traitement
$etch dune ligne du curseur maNtre
lectures et mises ! "our pour raliser une unit logique de travail
test sur la dure depuis le dernier commit
si la limite est atteinte * mise ! "our de la table de reprise et commit
sinon * poursuite de la boucle
$in de la boucle
mise ! "our de la table de reprise avec la valeur minimum de la cl
$in du programme
2gle * ds quun programme met ! "our des donnes )/2# il ne doit mettre ! "our que des
donnes )/2 1 donc exclure les critures sur squentiels ou +%)?3 4(?M5
F&2 $'ch'er5s7 s+:-ent'el5s7 en entr+e
Ce cas de $igure se ramne au cas prcdent# il su$$it de considrer les $ichiers squentiels
comme lquivalent de curseurs )/2. Il $aut donc prvoir un mcanisme de
repositionnement "usquau dernier enregistrement trait et commit. %ar scurit# le $ichier
ph;sique a;ant pu changer entre labend et la relance# il est pr$rable de conserver# dans
la table de reprise# la cl du $ichier et son rang# et de vri$ier au redmarrage que les deux
correspondent.
F&* $'ch'ers s+:-ent'els en +cr't-re
;piquement# ce sont les programmes dapurement# avec sauvegarde sur $ichier des lignes
supprimes. Il est trs dangereux de mlanger dans le m@me programme des critures sur
des $ichiers squentiels avec des mises ! "our )/2.
3n e$$et# les critures sur les $ichiers squentiels sont ralises par M4( par
externalisation de ses bu$$ers. Cette opration nest pas# pour linstant# s;nchrone avec le
commit )/2. Or# il est tou"ours possible quun problme survienne lors de lcriture
ph;sique *
erreur dentre sortie 1disque ou lecteur hors service5
plus de place sur le disque
nombre maximum dextends atteint
etcA
SAM - Support Technique
Copyright SDDC 2004
Page : 10 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
+ne telle pratique est dautant plus dangereuse# quelle peut trs bien $onctionner sans
problme pendant une longue priode. 3t le "our o0 le problme survient# il nest pas
certain quil soit mis en vidence. (a rsolution est dautant plus improbable.
?nciennement couramment utilise# notamment par les 3tudes &rands Magasins# cette
technique est au"ourdhui ! proscrire.
Les risques sont au"ourdhui les m@mes pour les $ichiers 4(?M. 7anmoins# une solution
semblable au 9O %B?(3( COMMI 1voir plus haut5 est annonce pour bientUt.
F&, No-vea-t+ %GGG&
3n HGGG# les 3tudes &rands Magasins ont expriment une nouvelle technique pour leur
chaNne 2sultats +nitaires# particulirement lourde et sensible. 3n plus de lintroduction du
paralllisme et du sous8programme CM36I# certains batch ont bn$ici de la gestion
du sqlcode F GHH 1 timeout ou deadlocK5.
3n e$$et ce sqlccode est lun des plus $rquents# il traduit une contention de verrouillage
temporaire. )e plus il saccompagne dun 2ollbacK implicite depuis le prcdent commit.
Lide de base tait de permettre ! un programme de repartir lui m@me ! son point de
dpart logique 1rcupration de sa cl de reprise et ouvertures des curseurs maNtres5 aprs
avoir dtect un sqlcode 8GHH sans attendre une intervention humaine. 3n e$$et# "usquici il
$allait gnrer une $in anormale du programme par ?bend et attendre quil soit relanc par
les pilotes# ce qui tait par$ois une cause de retard important..
La solution suggre consiste ! prendre en charge ce sqlcode FGHH et tenter de
recommencer le traitement un certain nombre de $ois.
EXEC SQL UPDATE TABLE1
SET COL3 = :H-V
, COL4 = :H-V
WHERE COL1 = :H-V
AND COL2 = :H-V
END-EXEC.
aprs lexcution de lupdate# la rcupration du sqlcode FGHH
permet dviter de laisser $iler labend et de redmarrer au dbut programme
IF SQLCODE NOT = 0 AND SQLCODE NOT = -11
CALL DB2ANOS !.
.....
ELSE
IF SQLCODE = -11 AND CPT-LOC" #= 10
ADD 1 TO CPT-LOC"
$O TO %&'()* +,-.,/0012
END-IF
END-IF.
3OVE 0 TO CPT-LOC"
7anmoins# cette mthode inclut un surcoPt en programmation et en tests# surtout pour les
programmes d"! crits. 3n e$$et le test du sqlcode doit @tre appliqu ! to-s les ordres# pas
seulement aux mises ! "ours# et la structure gnrale du programme doit @tre compatible
avec le principe du redmarrage. 3lle semble donc rserve aux chaNnes sensibles qui le
SAM - Support Technique
Copyright SDDC 2004
Page : 11 / 12 Version au 03/07/14 0!23
Le COMMIT dans les programmes Batch
Avec DB2
ncessitent rellement. +ne mauvaise prise en compte de cette suggestion risque davoir de
$unestes consquences# il $aut donc ne pas hsiter ! solliciter une validation des )/?.

SAM - Support Technique
Copyright SDDC 2004
Page : 12 / 12 Version au 03/07/14 0!23